我想实现我的网站登录.我基本上将Django Book中的以下位复制并粘贴在一起.但是,在提交我的注册表单时,我仍然收到错误(CSRF验证失败.请求中止.).有人可以告诉我是什么引发了这个错误以及如何解决它?
这是我的代码:
views.py:
# Create your views here.
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
def register(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
new_user = form.save()
return HttpResponseRedirect("/books/")
else:
form = UserCreationForm()
return render_to_response("registration/register.html", {
'form': form,
})
Run Code Online (Sandbox Code Playgroud)
register.html:
<html>
<body>
{% block title %}Create an account{% endblock %}
{% block content %}
<h1>Create an account</h1>
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Create …Run Code Online (Sandbox Code Playgroud) 我有一个Django视图,接收不需要CSRF令牌的POST.因此我@csrf_exempt在视图上使用了装饰器.问题是,有时我不会从视图中发出响应(它是一个Twitter机器人,它会收到每个推文的HTTP POST,我不想回复每条推文).当我没有发出响应时,我收到以下错误:
Traceback (most recent call last):
File "/home/adam/webapps/newman/lib/python2.5/django/core/handlers/base.py", line 100, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/home/adam/webapps/newman/lib/python2.5/django/views/decorators/csrf.py", line 24, in wrapped_view
resp.csrf_exempt = True
AttributeError: 'NoneType' object has no attribute 'csrf_exempt'
Run Code Online (Sandbox Code Playgroud)
resp(我假设是响应)是None,因为视图刚刚退出return.如何避免此错误,仍然不需要POST中的CSRF令牌.
谢谢!
在搜索互联网之后,人们通常会处理这种情况---前端是由django视图函数生成的,它可以向用户发送csrf令牌的cookie.当用户使用ajax向服务器发出请求时,人们可以重写将csrf发送到服务器的ajaxSend行为.
但是,我的情况是我的前端完全与后端分离,即我的前端是在运行nginx的专用服务器中,我只有一个html使用hashbang提供所有不同的页面.我的后端使用不同的域名在不同的服务器上运行,在这种情况下,客户端如何获取csrf cookie?我的后端只提供了json api返回.
谢谢.
如果csrf检查失败,Django会显示一个403错误的页面.

在我看来,这种错误可能会在常规使用中发生,例如,当用户在其浏览器设置中禁用cookie使用时.
不幸的是,此错误消息对最终用户没有太大帮助,并且具有"django-error"布局(这是一个问题,因为例如缺少站点导航).
Django有一个很好的机制来覆盖模板,但似乎这个模板在代码中是硬编码的.https://github.com/django/django/blob/1.6.8/django/views/csrf.py
有没有办法覆盖此模板,以便向用户提供更友好的消息?
这是模板中HTML的相关片段:
<form action="/submit_text/" method="post">
{% csrf_token %}
{% include "backbone/form_errors.html" %}
{{form.as_p}}
<input type="submit" value="Submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
这是我的settings.py MIDDLEWARE_CLASSES声明:
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',
)
Run Code Online (Sandbox Code Playgroud)
CSRF令牌根本不显示,导致a
禁止(403)CSRF验证失败.请求中止.
我刚刚将我的django更新为1.4.但是当我尝试提交登录表单时出现以下错误:
禁止(403)CSRF验证失败.请求中止.失败原因:CSRF令牌丢失或不正确.
在我的settings.py(MIDDLEWARE_CLASSES)中,我不得不删除以下行,因为它现在已弃用:
'django.middleware.csrf.CsrfResponseMiddleware',
Run Code Online (Sandbox Code Playgroud)
而且我开始得到这个错误.
一些必要的信息:Urls.py
Run Code Online (Sandbox Code Playgroud)url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'registration/login.html'}, name='login')
MIDDLEWARE_CLASSES = (
'django.middleware.gzip.GZipMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# 'django.middleware.csrf.CsrfResponseMiddleware',
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
)
Run Code Online (Sandbox Code Playgroud)
的login.html
{% extends "base.html" %}
{% block title %} Login {% endblock %}
{% block content %}
<div id="text">
<table>
<form action="" method="post">
{% csrf_token %}
<tr>
<td><label for="username">Email:</label></td>
<td><input type="text" name="username" value="" id="username"></td>
</tr>
<tr>
<td><label for="password">Password:</label></td>
<td><input type="password" name="password" value="" id="password"></td>
</tr>
<tr>
<td><input type="submit" value="Login" />
{% if next %}
<input type="hidden" name="next" …Run Code Online (Sandbox Code Playgroud) 我读过Django - CSRF验证失败,以及与django和POST方法相关的几个问题(和答案).其中一个最好但不能正常工作的答案是/sf/answers/329534761/
所有批准的答案都表明至少有三件事:
我完全按照建议做了,但错误仍然出现.我使用django 1.3.1(来自ubuntu 12.04存储库)和python 2.7(默认来自ubuntu)
这是我的观点:
# Create your views here.
from django.template import RequestContext
from django.http import HttpResponse
from django.shortcuts import render_to_response
from models import BookModel
def index(request):
return HttpResponse('Welcome to the library')
def search_form(request):
return render_to_response('library/search_form.html')
def search(request):
if request.method=='POST':
if 'q' in request.POST:
q=request.POST['q']
bookModel = BookModel.objects.filter(title__icontains=q)
result = {'books' : bookModel,}
return render_to_response('library/search.html', result, context_instance=RequestContext(request))
else:
return search_form(request)
else:
return search_form(request)
Run Code Online (Sandbox Code Playgroud)
这是我的模板(search_form.html):
{% extends "base.html" %}
{% …Run Code Online (Sandbox Code Playgroud) 我使用文档中的getCookie函数来获取值.djangocsrfmiddlewaretoken
我有以下ajax调用:
var url = reverse_removeprofile.replace(/deadbeef/, key);
$.ajax({
type: "DELETE",
url: url,
data: "csrfmiddlewaretoken=" + getCookie("csrftoken"),
success: function() { ... },
});
Run Code Online (Sandbox Code Playgroud)
执行此代码后,会django引发403异常,告诉我CSRF验证失败.但是,如果我改变了type从DELETE到POST那么django是高兴的,不抱怨的.
我真的无法在谷歌找到有用的东西,但我发现这张(现已关闭并修复)的门票:https://code.djangoproject.com/ticket/15258
如果我理解正确,那么这个问题已在1.4里程碑中修复.我使用django 1.4但仍无法通过DELETE请求验证CSRF令牌.
我在这里错过了什么吗?
我很久以前就听说过CSRF,而我大部分时间都听到的是:
防止CSRF攻击很重要,因为有人不会自动提交表单(使用机器人或其他东西)
嗯,这不是100%的真实,是吗?
我已经做了大约3年的网络抓取,并且提出请求,解析csrftokenmiddleware字段并将其与其他字段一起发布是非常简单的.
那么,它究竟是什么呢?
我无法理解为什么来自第三方网站的帖子被拒绝,即使该网站已添加到CSRF_TRUSTED_ORIGINSsettings.py 中的列表中。在发布说明 csrf 检查失败的帖子后,我收到了 403 错误。我认为添加该站点CSRF_TRUSTED_ORIGINS应该可以使该站点免受 csrf 检查。为了接收来自外部来源的帖子请求,我还应该做些什么吗?我正在运行 django 3.2
CSRF_TRUSTED_ORIGINS = ['site.lv']
Run Code Online (Sandbox Code Playgroud)
请求标头:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,lv;q=0.8,ru;q=0.7
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 899
Content-Type: application/x-www-form-urlencoded
Host: cvcentrs-staging.herokuapp.com
Origin: https://www.site.lv
Pragma: no-cache
Referer: https://www.site.lv/
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Microsoft Edge";v="96"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62
Run Code Online (Sandbox Code Playgroud)