我有另一个问题是由我对Django应用程序进行的主要升级(从1.7到1.10和Django Rest Framework到3.5.4)。我设法修复了在注册页面上导致500错误的其他一些错误,但我仍然遇到CSRF令牌问题。此功能在升级之前有效。我已经检查了错误分页中提到的所有内容(我有DEBUG = True),但所有这些看起来都没问题,如下:
在“CompanyAdmin”类中,我有注册方法:
def signup(self, request):
if request.method == "GET":
form = SignupForm()
else:
form = SignupForm(request.POST)
if form.is_valid():
company = form.save()
user = company.managers.all()[0]
user = authenticate(
email=user.email, password=request.POST["password1"])
if user is not None:
login(request, user)
return HttpResponseRedirect(reverse("bagdisken:index"))
return shortcuts.render_to_response("bagdisken/signup.html",
context=RequestContext(request, {
'form': form,
}))
我遇到了上下文问题,导致500错误,我通过在上下文中添加请求来修复。以前是这样的:
return shortcuts.render_to_response("bagdisken/signup.html", {'form': form})
CSRF令牌出现在视图中:
{% extends "admin/base_site.html"%}
{% load form_utils %}
{% block content_title%}{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block nav-global %}{% endblock %}
{% block coltype %}twelve columns offset-by-two{% endblock %}
{% block content%}
<form id="signup" action="#" method="POST" >
{% csrf_token %}
{{ form|render }}
<input type="submit" value="Submit" />
</form>
{% endblock %}
CsrfViewMiddleware也存在于设置中:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'corsheaders.middleware.CorsMiddleware',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
但是,缺少csrf令牌的隐藏输入。我该如何解决这个问题?
答案 0 :(得分:4)
不要使用render_to_response
,它已经过时了。它没有在响应中提供请求,因此CSRF模板上下文处理器不起作用。
请改用render
快捷方式。它使用请求呈现模板,因此CSRF令牌将起作用。
from django.shortcuts import render
def signup(self, request):
...
return render(request, "bagdisken/signup.html", {'form': form})