カスタムHTTPヘッダーを介して参照URLを取得する方法はありますか?


8

現在、次の関数を使用して参照ビューを取得しています。

def get_referer_view(request, default=None):   
    referer = request.META.get('HTTP_REFERER')
    if not referer:
        return default

    # remove the protocol and split the url at the slashes
    referer = re.sub('^https?:\/\/', '', referer).split('/')
    if referer[0] != request.META.get('SERVER_NAME'):
        return default

    # add the slash at the relative path's view and finished
    referer = u'/' + u'/'.join(referer[1:])
    return referer

viewプログラムロジックの結果としてをリダイレクトした場合。

return HttpResponseRedirect('dashboard')

... HTTP_REFERERリダイレクトされた変数を使用できるように、使用せずに参照ビューを取得する方法はありviewますか?これは常にブラウザのヘッダーで設定されるわけではありません。

ビューはプログラムでリダイレクトされるため、POSTを使用してデータを収集することはできません。

おそらく、どういうわけかカスタムヘッダーを設定および取得することは可能ですか?


1
以前のビューを制御していて、それはアプリケーションからのものですか?この情報をペイロードと応答に追加するだけです。たとえば、リダイレクトGETパラメータとして?came_from=inbox。リンクされている、Facebook、他の人がそれをしているように見えるので、それは大丈夫な練習であるべきです。
Mikko Ohtamaa

1
@MikkoOhtamaaはい、私はビューを制御します。ユースケースは通常、条件付きロジックのリダイレクトです。理想的には、URLをきれいにしておくことを望みます。
alias51

GETクエリパラメータを使用する方法です。別の方法として、ユーザーセッションデータにいくつかの状態情報を隠そうとすることもできますが、通常、ユーザーが複数のブラウザーウィンドウを開いていて、セッション変数への上書きが競合していると、情報が崩れます。
Mikko Ohtamaa

HttpResponseRedirect実際にはプログラム的なものではありません-実際のhttp 302応答を返し、ブラウザにリダイレクト先のビューの新しいURLへの新しいリクエストを
強制

回答:


2

Djangoのミドルウェアコンポーネントを使用します。

https://docs.djangoproject.com/en/3.0/topics/http/middleware/

このようなものはうまくいくはずです:

class HTTPReferer:

    def __init__(self, get_response):
        self.get_response = get_response

def __call__old(self, request):
    # old
    referer = request.META.get('HTTP_REFERER', None)
    request.referer = referer
    # other business logic as you like it
    response = self.get_response(request)
    return response

def __call__(self, request):
    # reflecting last edit
    path = request.path
    response = self.get_response(request)
    response['previous_path'] = path
    return response

したがって、Djangoのすべての要求/応答サイクルに必要な情報を関連付けることができます(カスタムヘッダーなどを設定することもできます)。

上記の例でHTTP_REFERERは、リクエストオブジェクトでとして使用できますreferer

編集:私は、あなたが懸念しているのHTTP_REFERERは、クライアントによって常に入力されるとは限らないということです。そのため、カスタムヘッダーに対して行われたすべてのリクエストにHttpRequest.path関連付けることができます。パスが十分でない場合は、リクエストの引数も保存できます。それだけだと思います。次に、最後のパスが入力されたカスタムヘッダーがあります。さらに、これで十分でない場合は、DjangoのURLリゾルバーを使用できます


おかげで、私の質問はHTTP_REFERERを使用せずに
alias51

@ alias51、理解しましたが、要求/応答サイクルを完全に制御できるので、代わりにカスタムヘッダーよりも使用しないのはなぜですか?Like:response ['I-AM-TRACKING-SOMETHING-IN-A-STATELESS-PROTOCOL'] = 'WHATEVER-YOU-NEED'。回答を修正します。
ジャズ

1

あなたがリクエストをするページを制御するので、確かに。次のように、現在のURLをいくつかのヘッダーに追加して関数に抽出します。リダイレクトの前にリクエストヘッダーを追加します。

これの代わりに:

def current_view():
   ...
   return HttpResponseRedirect('dashboard')

次のようなことをしてください:

def current_view():
    ...
    response = redirect('/dashboard')
    response['source-view'] = request.resolver_match.view_name
    return response

これsource-viewにより、受信ヘッダーで抽出できるカスタムヘッダー付きの302が生成されます。


0

興味のある方のために、私が導き出した解決策を示します。トリックは、view_nameまたはを保存する最初の要求の後にcookieを設定し、pathそれを呼び出してrequest、ビューをレンダリングする前にに保存することです。

class MyMiddleware:

    def __init__(self, get_response):
        # One-time configuration and initialization.
        self.get_response = get_response

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        # Add the referer cookie be accessible in request.response
        request.referer_view = request.COOKIES.get('referer_view', None)
        request.referer_path = request.COOKIES.get('referer_path', None)
        print('request.referer_view', request.referer_view)
        print('request.referer_path', request.referer_path)

        response = self.get_response(request)
        # Code to be executed for each request/response after
        # the view is called.

        # Set a cookie with the current view name that is cleared each time the view changes
        response.set_cookie('referer_view', request.resolver_match.view_name)
        response.set_cookie('referer_path', request.path)

        return response

値は、ビューが変更されるたびに、このサイクルで更新されます。


1
ポイントは、あなたはそれへの方向を得る解決策を得たということです。以前のパスは揮発性であり、この情報をCookieに保存することは冗長であるため、好みの問題でカスタムヘッダーよりもCookieを優先する場合は、デザインの観点からカスタムヘッダーを優先していました。あなたを助けてくれてうれしい:-)私はあなたの「解決策」を手遅れに見ました、さもなければ、私は私の答えを編集しませんでした。
ジャズ

ありがとう、なぜrequest.pathは揮発性だと思いますか?ヘッダーではなくCookieを使用する理由は、ヘッダーは簡単に操作できるため、安全性が低いためです。
alias51
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.