Форум сайта python.su
Через поиск нашёл много похожих вопросов, читал документацию, но так и не понял как применить 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', )
<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>
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() )
c = {} c.update(csrf(request))
Офлайн
я бегло посмотрел, поэтому могу быть не прав, но что если банально:
c=locals() c.update(csrf(request)) return render_to_response( u'login.html', c )
Офлайн
В render_to_response должен быть RequestContext
render_to_response( u'login.html', locals(), RequestContext(request) )
Офлайн
FishHook
У меня , насколько я помню, во всех проектах успешно работает и без него.
def aw_login(request): args={} args.update(csrf(request)) # code here return render_to_response('account_watcher_login.html', args)
Офлайн
JOHN_16, потому что ты его явно руками в контекст подсовываешь, а в RequestContext он автоматически попадает.
Офлайн
Можно вместо render_to_response() использовать сокращённый вызов render()
Офлайн
Спасибо, работают оба способа, и :
c=locals() c.update(csrf(request)) return render_to_response( u'login.html', c )
render_to_response( u'login.html', locals(), RequestContext(request) )
Офлайн