[英]How to control the use of http chunking in werkzeug under mod_wsgi
[英]How to use WSGI to reroute a user from http to https
原始問題
App Engine SDK 1.6.5
Python 2.7
而webapp2
我已經實現了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路由下面添加了另一個路由/控制器來捕獲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一樣。 這對我喜歡的黑客來說太像了。 我真的不喜歡我的代碼中的硬編碼URL。 更不用說登錄的2個請求並不是什么大不了的事,但可能還有其他一些例子,它最終導致成本太高。
注意1:如果您正在查看此解決方案,請注意使用HTTPS方案還意味着您將無法在不刪除SCHEME或配置為dev設置的變量的情況下使用開發控制台。
注意2:我能夠以編程方式提供HTTPS而不是HTTP。 我在正確的軌道上有下面的評論,但它需要一個參數。
webapp2.uri_for('login', _scheme='https')
這將為您提供正確的https://someapp.appspot.com/login網址。 遺憾的是,我沒有處理我的主要問題,如何處理人們在沒有https的情況下將地址欄輸入地址欄並收到錯誤,除非我使用上面的黑客。 所以我仍然在尋找WSGI方式將收入請求路由到HTPPS。
編輯:添加了注釋1並澄清了標題,我認為很明顯我是從源代碼而不是CGI使用WSGI。
在app.yaml中設置URL,而不是在代碼中。 請參閱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.yaml定義為以下內容來使App Engine Python重新路由請求:
的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 License 2.0的許可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.