CSRF令牌生成

我正在Django尝试一个简单的用户注册表单。 当我使用render_to_response时,不会生成CSRF令牌

返回render_to_response('registration / register.html',RequestContext(request,{'form':RegistrationForm()}))

在使用render时,CSRF令牌正在生成

return render(request,'registration / register.html',{'form':RegistrationForm()})

我对render_to_response做了什么错误render_to_response

以下是相关的代码块

views.py

@csrf_protect
def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = User.objects.create_user(
                username=form.cleaned_data['username'],
                password=form.cleaned_data['password1'],
                email=form.cleaned_data['email']
            )
            return HttpResponseRedirect('/register_success/')
    else:
        return render_to_response('registration/register.html', RequestContext(request, {'form': RegistrationForm()}))

register.html

{% extends "base.html" %}
{% block title %}User Registration{% endblock %}

{% block content %}
    <form method="post" action=".">
        {% csrf_token %}
        <table border="0">
            {{ form.as_table }}
        </table>
        <input type="submit" value="Register" />
    </form>
{% endblock %}

推荐的方法是使用render而不是render_to_response 。 代码更简单,并且CSRF令牌将起作用,因为render将使用请求上下文来呈现模板。

return render(request, 'registration/register.html', {'form': RegistrationForm()})

文档建议您不要使用render_to_response 。 在Django 1.10之前,你可以手动传递一个RequestContext作为第三个参数,但这在Django 1.10+中是不可能的。 您正在使用RequestContext作为不正确的第二个参数 - 第二个参数应该是常规字典。

最后,请注意,如果表单无效,则不会返回响应。 您可以通过稍微调整您的代码来解决此问题:

if request.method == 'POST':
    form = RegistrationForm(request.POST)
    if form.is_valid():
        ...
        return HttpResponseRedirect('/register_success/')
else:
    form = RegistrationForm()
return render(request, 'registration/register.html', {'form': form}) 
链接地址: http://www.djcxy.com/p/56527.html

上一篇: CSRF Token generation

下一篇: CSRF token just fires randomly in django