2010-07-17 4 views
15

Ich habe eine Django-Ansicht, die POSTs empfängt, die nicht das CSRF-Token haben müssen. Deshalb habe ich den @csrf_exempt Dekorateur auf der Ansicht verwendet. Das Problem ist, dass ich manchmal keine Antwort aus der Ansicht herausgebe (es ist ein Twitter-Bot, es erhält einen HTTP POST für jeden Tweet und ich möchte nicht auf jeden Tweet antworten). Wenn ich mir keine Antwort erteilen erhalte folgende Fehlermeldung:Deaktivieren von Django CSRF für Sichten, die nicht immer eine Antwort haben

Traceback (most recent call last): 

File "/home/adam/webapps/newman/lib/python2.5/django/core/handlers/base.py", line 100, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 

File "/home/adam/webapps/newman/lib/python2.5/django/views/decorators/csrf.py", line 24, in wrapped_view 
    resp.csrf_exempt = True 

AttributeError: 'NoneType' object has no attribute 'csrf_exempt' 

bzw. (was ich davon ausgehen, ist die Antwort) ist kein, da die Ansicht mit nur return verlassen wurde. Wie kann ich diesen Fehler vermeiden und immer noch keine CSRF-Token im POST benötigen.

Danke!

+0

Zeigen Sie etwas Code! –

Antwort

7

Django erwartet wirklich, dass View-Funktionen Antworten zurückgeben. Vielleicht könntest du eine leere Antwort anstelle von None zurückgeben? Oder einen HTTP-Fehlercode zurückgeben?

9

Ich weiß, dass Sie bereits Ihre Antwort erhalten haben, und tatsächlich hat Ned Recht; aber zusätzlich dazu: nicht nur Django erwartet wirklich Ansichten, um eine Antwort zurückzugeben, Ihr Kunde auch! Es ist ein HTTP-Fehler und wahrscheinlich eine Ressourcenverschwendung, um nichts zurückzugeben (und somit die Verbindung sofort zu schließen)!

Ich würde denken, dass ein 204 Kein Inhalt oder 304 nicht geändert (siehe: HTTP Status Codes) die entsprechenden http-Codes in dieser Situation verwenden; in django:

return HttpResponse(status=204) 

oder

from django.http import HttpResponseNotModified 
return HttpResponseNotModified() 
Verwandte Themen