10

Djangoでは、リクエストとレスポンスのコンテンツの長さをログに記録しようとします。これは、Djangoサーバーがstderrに出力するものとまったく同じです。

[05/Apr/2011 22:59:08] "GET /pages/ HTTP/1.1" 200 332161
[05/Apr/2011 22:59:15] "GET /pages/12 HTTP/1.1" 301 0
[05/Apr/2011 22:59:15] "GET /pages/12/ HTTP/1.1" 200 361474
[05/Apr/2011 22:59:16] "GET /pages/12/load/tags/ HTTP/1.1" 200 13899
[05/Apr/2011 22:59:16] "GET /pages/12/load/comments/ HTTP/1.1" 200 82

したがって、次のように単純なミドルウェアを記述しますが、「Content-Length」の値は常に空です。

class LogHttpResponse(object):
    def process_response(self, request, response):
        import datetime  
        print response.items()
        time_text = datetime.datetime.now().strftime('%m/%d/%Y %H:%M:%S')
        print '[%s] "%s %s" %d %s' % (time_text, request.method, request.path, 
                                      response.status_code, 
                                      response.get('Content-Length', ''))
        return response 

fire-debugで確認しましたが、応答ヘッダーに「Content-Length」があります。しかし、ミドルウェアには「Content-Length」はありません。「printresponse.items()」は次のように表示されます。

[('Content-Type', 'text/html; charset=utf-8')]

ミドルウェアの注文に問題はありますか?

4

2 に答える 2

16

fire-debugで確認しましたが、応答ヘッダーに「Content-Length」があります。しかし、ミドルウェアには「Content-Length」はありません[...]ミドルウェアの注文に問題はありますか?

はい。ミドルウェアクラスは、要求を処理するときにトップダウン(in settings.MIDDLEWARE_CLASSES)から適用され、応答を処理するときにボトムアップから適用されます。'django.middleware.http.ConditionalGetMiddleware'ミドルウェアクラスがある場合は、'Content-Length'HttpResponseにヘッダーが追加されます。

ただし、ミドルウェアクラスを後'django.middleware.http.ConditionalGetMiddleware'に配置settings.MIDDLEWARE_CLASSESすると、応答を処理するときに最初にこれが適用され、その後に適用されますConditionalMiddlewareContent-Lengthミドルウェアが呼び出されたときにまだ処理されていませんが、Firebugにヘッダーが表示されるのはそのためです。

ミドルウェアの詳細については、 Djangoミドルウェアのドキュメントを参照してください。

于 2011-04-06T03:01:38.543 に答える
7

どうlen(response.content)ですか?これにより、応答のコンテンツの文字数がわかります。それは必ずしもバイト数と同じではないと思います。

于 2011-04-05T16:20:14.263 に答える