python - route - Frasco url_para generar una URL http en lugar de https
flask session (5)
Con Flask 0.10, habrá una solución mucho mejor disponible que envolver url_for
. Si miras https://github.com/mitsuhiko/flask/commit/b5069d07a24a3c3a54fb056aa6f4076a0e7088c7 , se ha agregado un parámetro _scheme
. Lo que significa que puedes hacer lo siguiente:
url_for(''secure_thingy'',
_external=True,
_scheme=''https'',
viewarg1=1, ...)
_scheme
establece el esquema de URL, generando una URL como https://..
lugar de http://
. Sin embargo, de forma predeterminada, Flask solo genera rutas (sin host ni esquema), por lo que deberá incluir _external=True
para ir de /secure_thingy
a https://example.com/secure_thingy
.
Sin embargo, considere hacer que su sitio web sea solo para HTTPS. Parece que está intentando aplicar HTTPS parcialmente solo para unas pocas rutas "seguras", pero no puede asegurarse de que su https-URL no se modifique si la página que enlaza con la página segura no está encriptada. Esto es similar al contenido mixto .
Yo uso url_for
para generar redireccionamiento de url cuando un usuario ha url_for
sesión.
return redirect(url_for(''.index'', _external=True))
Sin embargo, cuando cambié la página a una conexión https , url_for
todavía me da http .
Me gustaría pedir explícitamente a url_for
que agregue https al comienzo de una url.
¿Me puede indicar cómo cambiarlo? Miro los documentos de Flask, sin suerte.
Gracias.
Establecer _scheme
en cada llamada url_for()
es extremadamente tedioso, y parece que PREFERRED_URL_SCHEME
no funciona. Sin embargo, al analizar el supuesto esquema de la solicitud a nivel WSGI parece convencer a Flask de que siempre construya URL de HTTPS:
def _force_https(app):
def wrapper(environ, start_response):
environ[''wsgi.url_scheme''] = ''https''
return app(environ, start_response)
return wrapper
app = Flask(...)
app = _force_https(app)
Si desea afectar el esquema de URL para todas las URL generadas por el servidor ( url_for
y redirect
), en lugar de tener que establecer _scheme
en cada llamada, parece que la respuesta "correcta" es usar middleware WSGI, como en este fragmento de código: http://flask.pocoo.org/snippets/35/
( Este error del matraz parece confirmar que esa es la forma preferida.)
Básicamente, si su entorno WSGI tiene environ[''wsgi.url_scheme''] = ''https''
, url_for
generará https:
URLs.
url_for
http://
URL de url_for
porque mi servidor estaba implementado detrás de un equilibrador de carga Elastic Beanstalk, que se comunica con el servidor en HTTP normal. Mi solución (específica de Elastic Beanstalk) fue así (simplificada a partir del fragmento de enlace vinculado anteriormente):
class ReverseProxied(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
scheme = environ.get(''HTTP_X_FORWARDED_PROTO'')
if scheme:
environ[''wsgi.url_scheme''] = scheme
return self.app(environ, start_response)
app = Flask(__name__)
app.wsgi_app = ReverseProxied(app.wsgi_app)
La parte específica de Elastic Beanstalk de eso es HTTP_X_FORWARDED_PROTO
. Otros entornos tendrían otras formas de determinar si la URL externa incluía https. Si solo desea usar siempre HTTPS, puede establecer de forma incondicional un environ[''wsgi.url_scheme''] = ''https''
.
PREFERRED_URL_SCHEME
no es la manera de hacer esto. Se ignora cada vez que una solicitud está en curso .
Si está accediendo a su sitio web a través de un proxy, Flask detecta correctamente que el esquema es HTTP
.
Browser -----HTTPS----> Proxy -----HTTP----> Flask
La solución más sencilla es configurar su proxy para configurar el encabezado X-Forwarded-Proto
. Flask detectará automáticamente este encabezado y administrará el esquema en consecuencia. Hay una explicación más detallada en la documentación del Frasco en la sección Configuraciones de proxy . Por ejemplo, si usa Nginx, tendrá que agregar la siguiente línea en su bloque de location
.
proxy_set_header X-Forwarded-Proto $scheme;
Como se mencionó anteriormente, si no puede cambiar la configuración de su proxy, puede usar el ProxyFix de werkzeug o crear su propia solución como se describe en la documentación: http://flask.pocoo.org/docs/0.12/deploying/ wsgi-standalone / # proxy-setups
url_for
respuesta aceptada con url_for
arg pero me resultó más fácil usar la variable de configuración PREFERRED_URL_SCHEME
y establecerla en https con:
app.config.update(dict(
PREFERRED_URL_SCHEME = ''https''
))
ya que no tienes que agregarlo a cada url_for
call.