7

元の質問


App Engine SDK 1.6.5
Python 2.7
webapp2

ページをhttpsに保護するためにwebapp2スキームを実装しました。問題は、ユーザーが https:// site/login の代わりに http:// 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)

http リクエストをキャッチするために、https ルートの下に別のルート / コントローラーを追加しました。
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: HTTP の代わりに HTTPS を提供するプログラム的な方法を得ることができました。以下のコメントで正しい軌道に乗っていましたが、引数が必要です。

webapp2.uri_for('login', _scheme='https')
これにより、正しいhttps://someapp.appspot.com/login URL が得られます。残念ながら、上記のハックを使用しない限り、httpsなしでアドレスバーにURLを入力してエラーを受け取る人を処理する方法という私の主な問題を処理しません. だから私はまだ所得要求をHTPPSにルーティングするWSGIの方法を探しています。

編集: 注 1 を追加し、タイトルを明確にしました。CGI ではなく、ソースから WSGI を使用していることは明らかだと思いました。

4

2 に答える 2

8

コードではなく、app.yaml で URL を設定します。https://developers.google.com/appengine/docs/python/config/appconfig#Secure_URLsを参照してください

例えば:

handlers:

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

これにより、HTTP が HTTPS にリダイレクトされます。

于 2012-05-30T09:46:37.660 に答える
1

これは、この質問のテストで使用した作業コードです。

注: 開発用 Web サーバー (この記事の執筆時点では v1.6.5) は https をサポートしていないため、開発環境で動作するには WSGI ルートからスキームを削除する必要があります。以下で行ったように、展開前にそれらを追加するか、変数を作成して環境をチェックするスキームを設定できます。


app.yaml をapp.yamlとして定義することで、App Engine Python でリクエストを再ルーティングできます。

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 でライセンスされています。

于 2012-06-01T05:47:36.417 に答える