Ошибка CSRF в Django; Как я могу добавить CSRF для моего входа в систему? - PullRequest
1 голос
/ 21 октября 2010

У меня есть простая форма, я хочу, чтобы пользователи могли войти в нее; Вот код шаблона с тегом CSRF:

<html>
<head><title>My Site</title></head>

<body>
    <form action="" method="post">{% csrf_token %}
        <label for="username">User name:</label>
        <input type="text" name="username" value="" id="username">
        <label for="password">Password:</label>
        <input type="password" name="password" value="" id="password">

        <input type="submit" value="login" />
        <input type="hidden" name="next" value="{{ next|escape }}" />
    </form>
</body>
</html>

Теперь вот моя страница views.py. Вопрос в том, куда мне добавить вспомогательную часть CSRF (сейчас я получаю ошибку токена CFRS) и как мне это сделать?

from django.contrib import auth

def login_view(request):
    username = request.POST.get('username', '')
    password = request.POST.get('password', '')
    user = auth.authenticate(username=username, password=password)
    if user is not None and user.is_active:
        # Correct password, and the user is marked "active"
        auth.login(request, user)
        # Redirect to a success page
        return HttpResponseRedirect("/account/loggedin/")
    else:
        # Show an error page
        return HttpResponseRedirect("account/invalid/")

def logout_view(request):

1 Ответ

5 голосов
/ 21 октября 2010

Вы должны добавить RequestContext к представлению, которое отображает страницу со строкой {% csrf_token %}. Вот пример из учебника :

# The {% csrf_token %} tag requires information from the request object, which is 
# not normally accessible from within the template context. To fix this, 
# a small adjustment needs to be made to the detail view, so that it looks 
# like the following:
#
from django.template import RequestContext
# ...
def detail(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    return render_to_response('polls/detail.html', {'poll': p},
                           context_instance=RequestContext(request))

Важная часть - context_instance=RequestContext(request). Это делает RequestContext доступным для шаблона формы при его визуализации.

...