【问题标题】:Django - CSRF Token generation - render_to_response vs renderDjango - CSRF 令牌生成 - render_to_response 与渲染
【发布时间】:2017-05-27 04:20:53
【问题描述】:

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

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

其中,当我使用 render 时,会生成 CSRF 令牌

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

我对@9​​87654323@ 做错了什么

以下是相关代码块

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 %}

【问题讨论】:

    标签: django render csrf render-to-response


    【解决方案1】:

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

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

    The docs recommend that you don't use 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}) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-31
      • 2010-12-20
      • 2020-08-16
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 2015-10-29
      • 2013-03-10
      相关资源
      最近更新 更多