【问题标题】:How to get request.route_url to spit out an https link instead of http using pyramid?如何让 request.route_url 使用金字塔吐出 https 链接而不是 http?
【发布时间】:2016-12-18 21:44:31
【问题描述】:

我在pyramid 框架上有一个应用程序,我到处都在调用request.route_url。我刚刚将我的应用程序切换到 HTTPS,并且所有链接仍然以 HTTP 的形式出现。

我是否可以在某个配置文件中放置一个全局设置来更改我的整个应用程序的设置,或者是否有一个参数我可以传递给这个函数,它会给我一个 HTTPS URL,或者最好是一个 //不可知的 URL (//)?

【问题讨论】:

    标签: python https pyramid


    【解决方案1】:

    如果您的 WSGI 服务器没有告诉应用程序传入的 url 是 HTTPS,则它是错误配置的。这几乎总是因为您在使用 HTTP 与 WSGI 服务器通信的反向代理(如 nginx)后面,并且没有正确地与 原始 请求是 HTTPS 的 WSGI 服务器通信。

    IF 使用 nginx / waitress / gunicorn / ... 等(您的代理和 wsgi 服务器)正确配置所有内容,然后request.route_url 将发出正确的 URL。修复不在 Pyramid 本身内。

    这里是有关该问题的一些文档。这里的一些解决方案是特定于女服务员的,但其中一些更通用(前缀中间件)并且可以在任何地方工作。如果您不使用女服务员,Gunicorn 和其他 WSGI 服务器也有自己特定的处理方式。

    https://docs.pylonsproject.org/projects/waitress/en/latest/reverse-proxy.html

    【讨论】:

    • 嗯,这很麻烦,因为我真的不知道我的应用程序前面发生了什么。它在 Heroku 上运行。我绝对确定没有涉及 Nginx,并且我确定女服务员正在运行,但我不知道 WSGI 在做什么。也不知道我可以改变什么来解决这个问题。
    • 在这种情况下,heroku 充当代理。从我上面的链接中,应该清楚发生了什么 - 您需要在堆栈中适当地设置 environ['wsgi.url_scheme'] = 'https'something 。有很多方法可以做到这一点。例如,如果您确定每个请求都通过 ssl,那么只需在 ini 文件的 [server:main] 部分设置 url_scheme = https
    • 我有点不同意修复不应该在 Pyramid 本身中。例如,如果您使用 AWS ALB,则不可能添加可用于告诉 Pyramid 客户端正在使用 HTTPS 的额外标头。我最终添加了一个 WSGI 中间件来强制 wsgi.url_scheme 进行这些部署,但这样做有点烦人。
    【解决方案2】:

    你想要的是route_path,它返回以/开头的URL,没有方案、域和端口(路径)。

    http://docs.pylonsproject.org/projects/pyramid/en/latest/api/request.html#pyramid.request.Request.route_path

    【讨论】:

    • 这将解决所提出的确切问题,但它隐藏了问题,该问题本身可以通过许多不同的方式表现出来,而不是简单的 url 生成(如如何设置 cookie,如何检查安全性等)。
    • 感谢@MichaelMerickel 的精确,为您的回答投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多