原来的问题
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。
设定的网址在app.yaml中,而不是代码。 见https://developers.google.com/appengine/docs/python/config/appconfig#Secure_URLs
例如:
handlers:
- url: /foo/.*
script: accounts.py
secure: always
这将HTTP重定向到HTTPS。
这是我在测试中使用了这一问题的工作代码。
注:开发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。