15

このエラーは、process_responseメソッドのカスタムミドルウェアで時々発生します。私は次のミドルウェアのリストを持っています:

MIDDLEWARE_CLASSES = [
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.doc.XViewMiddleware',
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'application.middleware.LastCampaignSessionMiddleware'

]

したがって、セッションミドルウェアは私のミドルウェアの前に配置されます。del request.sessionソースコードに式がありません。これはprocess_responseメソッドです。

    def process_response(self, request, response):
        if 'last_campaign_id' in request.session and request.session['last_campaign_id']:
            if request.COOKIES['last_campaign_id'] != request.session['last_campaign_id']:
                response.set_cookie('last_campaign_id', request.session['last_campaign_id'])
        return response

なぜそれが起こるのかわからない。

編集03-08-201212-30

ブラウザがファビコンを要求しているようです。

[03/Aug/2012 10:26:42] "GET /favicon.ico/ HTTP/1.1" 404 6701

このURLを解決するためのdjangoのデフォルトの動作はありませんか?このリクエストを処理するビューを明示的に指定しなかったためです。また、ページのソースコードではファビコンを使用していません。つまり、/favicon.icoをリクエストするのはブラウザだと思います。404エラーの場合、HttpRequestが適切に構築されないので、リクエストオブジェクトにセッションがないのも不思議ではありません。しかし、それは私の仮定にすぎません。

また、必要に応じて、このエラーが発生しているときにdjango開発サーバーを使用しています。

13-00を編集

ファビコンでこの問題を修正しましたが、それでもエラーが発生します。なぜセッションがリクエストに存在しないのですか?

4

2 に答える 2

19

問題はミドルウェアの順序にありました。

CommonMiddlewareは、URLを要求するときに「www」または末尾に「/」が追加されている場合にHttpResponsePermanentRedirectを返します(設定のAPPEND_SLASHおよびPREPEND_WWW)。このような場合、djangoはミドルウェアリストでprocess_requestメソッドの検索を停止し、process_responseメソッドの実行を開始します。

標準のdjangoミドルウェアのこのような動作に関する情報がないのは悪いことです(つまり、ミドルウェアがHttpResponseオブジェクトを返す場合があります)。

于 2012-08-03T12:38:07.520 に答える
5

Django 2.0にアップデートしてこのエラーが発生したためにここに来た場合は、名前MIDDLEWARE_CLASSESがに置き換えられたことを知りたいと思うかもしれませんMIDDLEWARE

詳細はこちらhttps://stackoverflow.com/a/47650447/1218179およびこちらhttps://docs.djangoproject.com/en/2.0/topics/http/middleware/

于 2018-03-25T23:08:46.413 に答える