问题
I want to redirect all requests to http
to https
.
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
seems to be related to environment variables:
http://wsgi.readthedocs.org/en/latest/definitions.html#envvar-wsgi.url_scheme
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.
There is a snippet of code here:
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
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)
回答1:
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)
Tested with 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
For details on how plugins work, see the Bottle docs.
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.
来源:https://stackoverflow.com/questions/20309853/how-to-set-wsgi-url-scheme-to-https-in-bottle