Найти - Пользователи
Полная версия: CSRF token missing or incorrect
Начало » Python для новичков » CSRF token missing or incorrect
1
SoT
Через поиск нашёл много похожих вопросов, читал документацию, но так и не понял как применить CSRF защиту.
В итоге при попытке логина выдаёт ошибку
Forbidden (403)

CSRF verification failed. Request aborted.

Вот классы из settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

Вот шаблон( в правильное ли место я добовляю csrf_token?
<html>
    <body>
        {% if request.user.is_authenticated %}
            {{request.user.username}}
        {% else %}
        <form method="POST" action="/prices/login/">{% csrf_token %}
            <table>
            
                <tr>
                    <td> Логин  </td>
                    <td><input type="text" name="login" /> </td>
                </tr>
                <tr>
                    <td> Пароль  </td>
                    <td><input type="password" name="password" /> </td>
                </tr>
            </table> 
        <input type="submit" value="Войти" />
        </form>
        {% endif %}
    </body>
</html>

А вот и сама функция БЕЗ попыток внести csrf
def login( request ) :
    if not request.user.is_authenticated() :
        try :
            login = request.POST['login']
            password = request.POST['password']
            user = auth.authenticate( username = login, password = password )
            if user and user.is_active :
                auth.login( request, user )
            else :
                HttpResponseRedirect ( '/prices/invalidlogin/' )
        except KeyError :
            pass           
    return render_to_response( u'login.html', locals() )

Можно ли как то внести переменную с csrf в функцию render_to_response
    c = {}
    c.update(csrf(request))
Что нужно сделать чтобы она передалась в locals() ?
JOHN_16
я бегло посмотрел, поэтому могу быть не прав, но что если банально:
c=locals()
c.update(csrf(request))
return render_to_response( u'login.html',  c )
FishHook
В render_to_response должен быть RequestContext

render_to_response( u'login.html', locals(), RequestContext(request) )
JOHN_16
FishHook
У меня , насколько я помню, во всех проектах успешно работает и без него.
def aw_login(request):
    args={}
    args.update(csrf(request))
     # code here
     return render_to_response('account_watcher_login.html', args)
FishHook
JOHN_16, потому что ты его явно руками в контекст подсовываешь, а в RequestContext он автоматически попадает.
mks
Можно вместо render_to_response() использовать сокращённый вызов render()
SoT
Спасибо, работают оба способа, и :
c=locals()
c.update(csrf(request))
return render_to_response( u'login.html',  c )
и
render_to_response( u'login.html', locals(), RequestContext(request) )
И спасибо за render()
Думаю тему можно закрывать.

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB