python - 如何使用 WSGI 将用户从 http 重新路由到 https

标签 python google-app-engine ssl https webapp2

原始问题


应用引擎 SDK 1.6.5
Python 2.7
网络应用2

我已经实现了 webapp2 方案来保护页面到 https。问题是,当用户说 http://site/login 而不是 https://site/login 时,由于方案无法识别路由,他们会收到 404 错误。

例子main.py

#  Libraries
import webapp2

#  Local Controllers
from controllers.HomeHandler import HomeHandler
from controllers.LoginHandler import LoginHandler

app = webapp2.WSGIApplication([
    webapp2.Route(r'/', HomeHandler),
    webapp2.Route(r'/login', LoginHandler, schemes=['https'], name='login')
], debug=True)

我在 https 路由下面添加了另一个路由/ Controller 来捕获 http 请求:
webapp2.Route(r'/login', RouteLogin)

路由登录.py

#  Libraries
import webapp2

class RouteLogin(webapp2.RequestHandler):
    def get(self):
        self.redirect('https://site.appspot.com/login')

这行得通,但似乎应该有更好的方法来做到这一点。就像在 Apache Web 服务器上使用 htaccess 一样。这太像我喜欢的 hack 了。我真的不喜欢我的代码中的硬编码 URL。更不用说 2 个登录请求没什么大不了的,但可能还有其他示例最终导致成本过高。

注意 1:如果您正在查看此解决方案,请注意使用 HTTPS 方案还意味着如果不删除 SCHEME 或配置为开发设置的变量,您将无法使用开发控制台。

注意 2:我能够以编程方式提供 HTTPS 而不是 HTTP。我在下面的评论中走在了正确的轨道上,但它需要一个论点。

webapp2.uri_for('login', _scheme='https')
这会给你正确的 https://someapp.appspot.com/login网址。不幸的是,它没有解决我的主要问题,即如何处理人们在没有 https 的情况下将 url 输入地址栏并收到错误,除非我使用上面的 hack。所以我还在寻找 WSGI 的方式来将收入请求路由到 HTPPS。

编辑:添加注释 1 并澄清标题,我认为很明显我使用的是源代码中的 WSGI 而不是 CGI。

最佳答案

在 app.yaml 中设置 URL,而不是在代码中。参见 https://developers.google.com/appengine/docs/python/config/appconfig#Secure_URLs

例如:

handlers:

- url: /foo/.*
  script: accounts.py
  secure: always

这会将 HTTP 重定向到 HTTPS。

关于python - 如何使用 WSGI 将用户从 http 重新路由到 https,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10804873/

相关文章:

python - 将类序列化为 python/gae 的 json

Python websocket 创建连接

python - 如何在 python 中按下键盘来停止秒表?

Python - Selenium 不会返回到上一页

python - CORS - 使用 AJAX 在 Python (webapp2) 网络服务上发布

ubuntu - dokku 和 digital ocean 的 ssl

database - 我可以使用远程数据库服务器配置 ssl 吗?

python - 在 tkinter 中如何将入口函数分配给变量

python - 如何从 python 发布到 hipchat

python - 如何在Python函数中定义字符串?