首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flask url_for生成http URL而不是https

Flask url_for生成http URL而不是https
EN

Stack Overflow用户
提问于 2013-02-11 18:56:22
回答 6查看 35K关注 0票数 63

当用户注销时,我使用url_for生成一个重定向网址:

代码语言:javascript
运行
复制
return redirect(url_for('.index', _external=True))

但是,当我将页面更改为https连接时,url_for仍然为我提供http。

我想明确地要求url_for在网址的开头添加https。

你能告诉我怎么改吗?我看了看Flask的文档,没有运气。

EN

回答 6

Stack Overflow用户

发布于 2016-06-16 01:53:12

如果您想要影响所有服务器生成的URL (url_forredirect)的URL方案,而不是在每次调用时都设置_scheme,那么“正确”的答案似乎是使用WSGI中间件,如下面的代码片段所示:http://flask.pocoo.org/snippets/35/

(This Flask bug似乎证实,这是首选的方式。)

基本上,如果您的WSGI环境有environ['wsgi.url_scheme'] = 'https',那么url_for将生成https: URL。

我从url_for获取HTTP,因为我的服务器部署在Elastic Beanstalk负载均衡器后面,后者以常规的http://与服务器通信。我的解决方案(特定于Elastic Beanstalk)是这样的(从上面链接的代码片段中简化):

代码语言:javascript
运行
复制
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)

弹性豆茎特定的部分是HTTP_X_FORWARDED_PROTO。其他环境可能有其他方法来确定外部URL是否包含https。如果你只想一直使用HTTPS,你可以无条件地设置environ['wsgi.url_scheme'] = 'https'

PREFERRED_URL_SCHEME不是实现这一点的方法。我是ignored whenever a request is in progress

票数 53
EN

Stack Overflow用户

发布于 2014-10-30 01:23:28

我用https arg尝试了接受的答案,但我发现使用PREFERRED_URL_SCHEME配置变量并将其设置为https会更容易,方法是:

代码语言:javascript
运行
复制
app.config.update(dict(
  PREFERRED_URL_SCHEME = 'https'
))

因为您不必将其添加到每个url_for调用中。

票数 31
EN

Stack Overflow用户

发布于 2017-08-15 20:45:28

如果你是通过Nginx这样的反向代理来访问你的网站,那么Flask就能正确地判断出该方案是HTTP

代码语言:javascript
运行
复制
Browser -----HTTPS----> Reverse proxy -----HTTP----> Flask

最简单的解决方案是配置反向代理来设置X-Forwarded-Proto标头。Flask将自动检测此标头并相应地管理方案。有一个more detailed explanation in the Flask documentation under the Proxy Setups section。例如,如果您使用Nginx,则必须在location块中添加以下行。

代码语言:javascript
运行
复制
proxy_set_header   X-Forwarded-Proto    $scheme;

如前所述,如果您不能更改代理的配置,您可以使用werkzeug ProxyFix或按照文档中的说明构建自己的修复程序:http://flask.pocoo.org/docs/0.12/deploying/wsgi-standalone/#proxy-setups

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14810795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档