tutorial route app python url-routing flask werkzeug

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.