如何将wsgi.url_scheme设置为瓶中的https? [英] How to set wsgi.url_scheme to https in bottle?

查看:398
本文介绍了如何将wsgi.url_scheme设置为瓶中的https?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将所有请求重定向到 http https

I want to redirect all requests to http to https.

是否存在将 wsgi.url_scheme 设置为 https 在Python 2.7瓶应用程序中?

Is there a generic approach to setting wsgi.url_scheme to https in a Python 2.7 bottle application?

该应用程序的一般结构是:

The general structure of the application is:

setup.py  // contains 'install_requires'  
wsgi  
 - myapplication.py  // the custom application containing bottle routes

wsgi.url_scheme 似乎与环境变量有关:

wsgi.url_scheme seems to be related to environment variables:

http://wsgi.readthedocs.org/ en / latest / definitions.html #envvar-wsgi.url_scheme

但我不确定如何将环境变量设置为 https 以及是否可以在 setup.py myapplication.py 文件。

But I'm not sure how to actually 'set' the environment variable to https and whether it can be done in the setup.py or myapplication.py files.

这里有一段代码:

https://github.com/defnull/bottle/issues/347

def i_am_https_dammit(app):
    def https_app(environ, start_response):
        environ['wsgi.url_scheme'] = 'https'
        return app(environ, start_response)
    return https_app

但我不知道如何实现要点其中,我对该应用程序的调用来自 cork 并且只使用:

But I don't know how I could implement the gist of this, as my call to the application is from cork and just uses:

application=default_app()  
session_opts = {
    'session.cookie_expires': True,
    'session.encrypt_key': 'please use a random key and keep it secret!',
    'session.httponly': True,
    'session.timeout': 3600 * 24,  # 1 day
    'session.type': 'cookie',
    'session.validate_key': True,
}
application = SessionMiddleware(application, session_opts)


推荐答案

如果我不理解你的问题,请原谅我,但为什么不呢?为您的Bottle应用程序安装一个简单的重定向插件?这样的事情:

Forgive me if I'm not understanding your question, but why not just install a simple redirect plugin for your Bottle app? Something like this:

import bottle

app = bottle.app()

def redirect_http_to_https(callback):
    '''Bottle plugin that redirects all http requests to https'''

    def wrapper(*args, **kwargs):
        scheme = bottle.request.urlparts[0]
        if scheme == 'http':
            # request is http; redirect to https
            bottle.redirect(bottle.request.url.replace('http', 'https', 1))
        else:
            # request is already https; okay to proceed
            return callback(*args, **kwargs)
    return wrapper

bottle.install(redirect_http_to_https)

@bottle.route('/hello')
def hello():
    return 'hello\n'

bottle.run(host='127.0.0.1', port=8080)

使用curl测试:

% 05:57:03 !3000 ~>curl -v 'http://127.0.0.1:8080/hello'
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /hello HTTP/1.1
> User-Agent: curl/7.30.0
> Host: 127.0.0.1:8080
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 303 See Other
< Date: Sun, 01 Dec 2013 10:57:16 GMT
< Server: WSGIServer/0.1 Python/2.7.5
< Content-Length: 0
< Location: https://127.0.0.1:8080/hello
< Content-Type: text/html; charset=UTF-8






有关插件的详细信息工作,请参阅瓶文档

简而言之,此插件通过拦截所有请求和检查协议(方案)来工作。如果方案是http,则插件指示Bottle将HTTP重定向返回到相应的安全(https)URL。

Briefly, this plugin works by intercepting all requests and checking the protocol ("scheme"). If the scheme is "http", the plugin instructs Bottle to return an HTTP redirect to the corresponding secure (https) URL.

这篇关于如何将wsgi.url_scheme设置为瓶中的https?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆