簡體   English   中英

如何使用WSGI將用戶從http重新路由到https

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM