如何使用WSGI从HTTP用户重新路由到https(How to use WSGI to rerou

2019-06-24 23:21发布

原来的问题


App Engine的SDK 1.6.5
Python 2.7版
而webapp2

我已经实现webapp2的方案来保护网页到https。 问题是,当用户去说的http://网站/登录代替https://网站/登录,他们由于无法识别路线方案得到一个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路径下面另一条路线/控制器赶上http请求:
webapp2.Route(r'/login', RouteLogin)

RouteLogin.py

#  Libraries
import webapp2

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

这工作,但似乎应该有一个更好的方式来做到这一点。 如使用Apache Web服务器上使用。htaccess。 这实在是太像我喜欢黑客攻击。 我真的不喜欢在我的代码硬编码网址。 更何况,这是2个请求这对于登录不是什么大不了的事,但它最终成本太高,可能还有其他的例子。

注1:如果你是在寻找这个解决方案要知道,使用HTTPS模式也意味着你将无法使用,开发者控制台而不删除方案或配置您为开发设置一个变量。

注2:我是能够得到一个程序化的方式服务HTTPS而不是HTTP。 我是在正确的轨道与下面的评论,但它需要一个自变量。

webapp2.uri_for('login', _scheme='https')
这会给你正确的https://someapp.appspot.com/login网址。 遗憾的是它并不需要我如何处理人输入网址到地址栏没有HTTPS,除非我用上面的黑客收到错误主要问题的关心。 所以,我现在还在找工作的WSGI方式航线收入要求HTPPS。

编辑:补充说明1,明确的称号,我认为这是明显的,我用WSGI从源头上,而不是CGI。

Answer 1:

设定的网址在app.yaml中,而不是代码。 见https://developers.google.com/appengine/docs/python/config/appconfig#Secure_URLs

例如:

handlers:

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

这将HTTP重定向到HTTPS。



Answer 2:

这是我在测试中使用了这一问题的工作代码。

注:开发Web服务器(在本文写作v1.6.5的)不支持HTTPS所以你的WSGI路线将需要删除在开发环境中工作的方案。 你可以将其添加回部署前或创建一个变量来设置,检查我下面做环境的方案。

你可以得到App Engine的Python中定义的app.yaml为重新路由请求:
的app.yaml

application: cgi-vs-wsgi
version: 1
runtime: python27
api_version: 1
threadsafe: yes

libraries:
- name: webapp2
  version: latest

handlers:

- url: /profile
  script: main.app
  secure: always

- url: /login
  script: main.app
  secure: always

- url: /.*
  script: main.app

然后,在main.py你可以宣布你的WSGI处理程序为正常,如:

main.py

import webapp2
import os

# Models
from models.Shout import Shout

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

if os.environ['SERVER_SOFTWARE'].startswith('Development'):
    app_scheme = 'http'
else:
    app_scheme = 'https'

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

我已经上传的代码为这个应用程序到我的AE-BaseApp的GitHub请随时免费下载和在应用程序中使用。 该代码许可Apache许可证2.0。



文章来源: How to use WSGI to reroute a user from http to https