65

url_forユーザーがログアウトしたときにリダイレクトURLを生成するために使用しています:

return redirect(url_for('.index', _external=True))

ただし、ページをhttps接続に変更してurl_forも、 httpが表示されます。

URLの先頭にhttpsurl_forを追加するように明示的に依頼したいと思います。

変更方法を教えていただけますか?運が悪かったので、Flaskのドキュメントを見ました。

4

7 に答える 7

69

Flask 0.10を使用すると、ラッピングよりもはるかに優れたソリューションを利用できるようになりますurl_forhttps://github.com/mitsuhiko/flask/commit/b5069d07a24a3c3a54fb056aa6f4076a0e7088c7を見ると、_schemeパラメーターが追加されています。つまり、次のことができます。

url_for('secure_thingy',
        _external=True,
        _scheme='https',
        viewarg1=1, ...)

_schemeURLスキームを設定し、のhttps://..代わりにのようなURLを生成しますhttp://_external=Trueただし、デフォルトでは、Flaskは(ホストまたはスキームなしで)パスのみを生成するため、 toからへ/secure_thingyの移動を含める必要がありますhttps://example.com/secure_thingy


ただし、代わりにWebサイトをHTTPSのみにすることを検討してください。少数の「安全な」ルートに対してのみHTTPSを部分的に適用しようとしているようですが、安全なページにリンクしているページが暗号化されていない場合、https-URLが変更されないことを保証できません。これは混合コンテンツに似ています。

于 2013-02-27T12:17:54.487 に答える
54

呼び出しごとに設定するのではなく、すべてのサーバー生成 URL (url_forおよび)の URL スキームに影響を与えたい場合、"正しい" 答えは、次のスニペットのように WSGI ミドルウェアを使用することのようです: http:// flask.pocoo.org/snippets/35/redirect_scheme

(このフラスコのバグは、それが好ましい方法であることを確認しているようです。)

基本的に、WSGI 環境に がある場合はenviron['wsgi.url_scheme'] = 'https'、URLurl_forが生成されます。https:

私のサーバーは、通常の HTTP でサーバーと通信する Elastic Beanstalk ロードバランサーの背後にデプロイされていたため、http://URLを取得していました。url_for私のソリューション (Elastic Beanstalk に固有) は次のようなものでした (上記のリンクのスニペットから簡略化):

class ReverseProxied(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        scheme = environ.get('HTTP_X_FORWARDED_PROTO')
        if scheme:
            environ['wsgi.url_scheme'] = scheme
        return self.app(environ, start_response)

app = Flask(__name__)
app.wsgi_app = ReverseProxied(app.wsgi_app)

その Elastic Beanstalk 固有の部分はHTTP_X_FORWARDED_PROTO. 他の環境では、外部 URL に https が含まれているかどうかを判断する別の方法があります。常に HTTPS を使用したい場合は、無条件に を設定できますenviron['wsgi.url_scheme'] = 'https'

PREFERRED_URL_SCHEMEこれを行う方法ではありません。リクエストが進行中の場合は常に無視されます。

于 2016-06-15T17:53:12.177 に答える
8

_scheme通話ごとに設定するのurl_for()は非常に面倒で、PREFERRED_URL_SCHEMEうまくいかないようです。ただし、WSGI レベルでリクエストの想定スキームをいじることで、常に HTTPS URL を構築するように Flask を説得することに成功しているようです。

def _force_https(app):
    def wrapper(environ, start_response):
        environ['wsgi.url_scheme'] = 'https'
        return app(environ, start_response)
    return wrapper

app = Flask(...)

app = _force_https(app)
于 2015-01-31T02:34:43.207 に答える