2

カスタム ミドルウェアがレンダリングされた応答を返します (with RequestContext)。

これにより、csrf_tokenコンテキスト var がNOTPROVIDED(提供されていない Djangos sentinel の値)に設定され、CSRF ミドルウェアが on で呼び出されるため、{% csrf_token %}出力が得られないようです。process_view

ミドルウェアでレンダリングされた応答は複雑ではなく、めったに使用されない特殊なケースですが、Djangos 組み込みset_languageビューへの POST 要求であるため、言語を変更するには CSRF トークンが必要です。

これを解決するための最良のアプローチは何ですか?

4

2 に答える 2

2

process_request で csrf トークンを使用できない理由は、process_view各ミドルウェアの後に実行される csrf ミドルウェアにトークンが設定されているため、代わりにprocess_requestコードを移動する必要があるためです。process_view

def process_view(self, request, view_func, view_args, view_kwargs):
    if some_clause:
        return render(request, 'foo.html', {'foo': 'bar'})

    return view_func(request, view_args, view_kwargs)
于 2013-10-15T13:57:03.993 に答える
0

1.5 ドキュメントから:

process_request() は None または HttpResponse オブジェクトを返す必要があります。

試す:

class FooMiddleware():
    def process_request(self, request):
        if some_clause:
            return render(request, 'foo.html', {'foo': 'bar'})
        return None
于 2013-10-15T10:26:48.270 に答える