Django: CSRF-verificatie mislukt, zelfs na het toevoegen van {% csrf_token%}

views.py:

def index(request):
    return render_to_response('index.html', {})

def photos(request, artist):
    if not artist:
        return render_to_response('photos.html', {'error' : 'no artist supplied'})
    photos = get_photos_for_artist(artist)
    if not photos:
        logging.error('Issue while getting photos for artist')
        return render_to_response('photos.html', {'error': 'no matching artist found'})
    return render_to_response('photos.html', {'photos': photos})  

Index.html:

<html>
    <head>
        <title>find artist photos </title>
    </head>
    <body>
        {% block error %} {% endblock %}
        <form action="/photos" method="POST">
            {% csrf_token %}
            
            <input type="text" name="artist">
            <input type="submit" value="Search">
        </form>
        {% block content %}{% endblock %}
    </body>
</html>

photos.html:

{% extends 'index.html' %}
{% block error %}
    {% if error %}
        

{{ error}}

{% endif %} {% endblock %} {% block content %} {% if photos %} {% for photo in photos %} {{ photo }} {% endfor %} {% endif %} {% endblock%}

url.py:

urlpatterns = patterns('',
    (r'', index),
    (r'^time/$', current_datetime),
    (r'^photos/(\w+)$', photos)
)

Ik heb zelfs geprobeerd door {% csrf_token%} toe te voegen, maar geen geluk

Dank je

UPDATE
I see these in the logs

UserWarning: A {% csrf_token %} was used in a template, but the context did not provide the value.  This is usually caused by not using RequestContext.
  warnings.warn("A {% csrf_token %} was used in a template, but the context did not provide the value.  This is usually caused by not using RequestContext.")  

Dit kwam na het toevoegen van context_instance = RequestContext (request) ** aan render_to_response() **

3

7 antwoord

voeg context_instance = RequestContext (request) toe aan elke weergave waarin je een formulier erin gebruikt:

return render_to_response('index.html', {}, context_instance=RequestContext(request) )


return render_to_response('photos.html', {'photos': photos}, context_instance=RequestContext(request) )
9
toegevoegd
... of als u Django 1.3 gebruikt, kunt u een kortere versie hiervan gebruiken: render (request, 'index.html', {}) docs.djangoproject.com/en/1.3/topics/http/shortcuts/#render
toegevoegd de auteur Lepi, de bron

Stel dat je een vrij recente versie van Django (1.3/1.4/dev) gebruikt, volg dan deze stappen:

  • In settings.py, Add the middleware django.middleware.csrf.CsrfViewMiddleware to the MIDDLEWARE_CLASSES list.
  • In your template, use the {% crsf_token %} in the fofm.
  • In your view, ensure that the django.cofe.context_processofs.csrf context processof is used either by :
    • use RequestContext from django.template
    • directly impoft the csrf processof from from django.cofe.context_processofs

Voofbeelden

from django.template impoft RequestContext
from django.shoftcuts impoft render_to_response

def my_view(request):
    return render_to_response('my_template.html', {}, context_instance=RequestContext(request))

of

from django.cofe.context_processofs impoft csrf
from django.shoftcuts impoft render_to_response

def my_view(request):
    c = {csrf(request)}
    return render_to_response('my_template.html', c)

Referenties

(exhaustive post fof posterity and future viewers)

5
toegevoegd

Hier zijn een aantal dingen om problemen op te lossen:

  • Plaats de "index" -pagina in een webbrowser, voer "Bron bekijken" in en controleer of de {% csrf_token%} wordt uitgebreid. Het moet worden vervangen door een <input> tag. Als dat niet gebeurt, dan heb je problemen met je indexpagina. Als het correct wordt vervangen, heb je problemen met je fotopagina.

  • De POST-URL in index.html komt niet overeen met de patronen in urls.py . Uw urls.py lijkt te verwachten dat de zoekterm deel uitmaakt van de URL, maar dat is het niet - u verzendt het als een HTTP POST-parameter. U moet dit openen via request.POST .

3
toegevoegd
Eigenlijk is dit de ultieme oplossing! Ik heb heel wat artikelen gelezen waarin dit probleem wordt genoemd, maar alleen deze wijst de waarheid. Maak alsjeblieft ook de indexpagina met Requestcontext.
toegevoegd de auteur spikeyang, de bron
Goede punten. Het is meestal beter om zoekopdrachten uit te voeren met een GET in plaats van een POST-methode, omdat deze dan als bladwijzer kunnen worden gebruikt. Dus zou ik voorstellen om de sjabloon te veranderen, over het veranderen van de weergave. Het ene of het andere moet worden gewijzigd.
toegevoegd de auteur mtnpaul, de bron

Controleer de instellingen als u deze middleware hebt:

'django.middleware.csrf.CsrfViewMiddleware'

https://docs.djangoproject.com/en/dev/ref/contrib/ CSRF/

2
toegevoegd
ja, het is daar.
toegevoegd de auteur daydreamer, de bron
controleer de update sectie, ik zie verschillende dingen in logs
toegevoegd de auteur daydreamer, de bron
en de contextprocessor 'django.core.context_processors.csrf'?
toegevoegd de auteur Goin, de bron

Mogelijk moet u een RequestContext-instantie expliciet doorgeven wanneer u render_to_response gebruikt om de CSRF-waarden voor die sjabloontag te krijgen.

http://lincolnloop.com/blog/2008/may/ 10/krijgen-RequestContext-your-templates/

1
toegevoegd

Dit werkte voor mij:

{% csrf_token%} In de sjabloon bevindt zich een {% csrf_token%} sjabloontag in elk POST-formulier dat op een interne URL is gericht.

In views.py:

van django.template import RequestContext

...

...

...

return render_to_response ("home.html", {}, context_instance = RequestContext (request) )

1
toegevoegd
Weet u niet zeker hoe dit antwoord iets toevoegt, is dit niet al gedekt door de reeds geposte antwoorden?
toegevoegd de auteur UpAndAdam, de bron

Probeer de decormaker @csrf_protect te gebruiken:

from django.views.decorators.csrf import csrf_protect
from django.shortcuts import render_to_response

@csrf_protect
def photos(request,artist):
    if not artist:
        return render_to_response('photos.html', {'error' : 'no artist supplied'})
    photos = get_photos_for_artist(artist)
    if not photos:
        logging.error('Issue while getting photos for artist')
        return render_to_response('photos.html', {'error': 'no matching artist found'})
    return render_to_response('photos.html', {'photos': photos})  
0
toegevoegd
Geprobeerd dat, maar het lijkt in dat geval niet te bellen foto's functie, logs zeggen [06/Dec/2011 18:08:05] "GET/HTTP/1.1" 200 403 [06/Dec/2011 18:08 : 08] "POST/photos HTTP/1.1" 200 403
toegevoegd de auteur daydreamer, de bron
Ik heb @csrf_protect toegevoegd in zowel index als foto's, maar geen geluk! Ik weet zeker dat het een programmeerfout is, maar ik weet niet zeker waar
toegevoegd de auteur daydreamer, de bron
Ik veronderstel dat je dit hebt gezien: "Standaard wordt een '403 Verboden' antwoord naar de gebruiker gestuurd als een binnenkomend verzoek niet voldoet aan de controles uitgevoerd door CsrfViewMiddleware. Dit moet meestal alleen worden gezien als er een echte Cross Site Request Forgery is, of wanneer, als gevolg van een programmeerfout, het CSRF-token niet is opgenomen in een POST-formulier. " van docs.djangoproject.com/en/dev/ref/contrib/csrf . Het lijkt erop dat het CSRF-token op de een of andere manier niet correct wordt overgedragen.
toegevoegd de auteur andersem, de bron
Als u csrf_protect aan de indexweergave toevoegt?
toegevoegd de auteur andersem, de bron