我开发了一个 Django 文件上传 API,它接收来自客户端的发布数据并将数据保存为文件。
根据Django CSRF 手册,HTTP 请求标头应使用 csrftoken cookie 值设置 X-CSRFToken。我已经通过下面的代码设置了 X-CSRFToken,但是 Django 服务器仍然禁止 POST 请求(403),如下图所示。
$(document).ready(function(){
var authid
$.get("http://localhost:8000/v1/getAuthID?username=testuser1&password=123", function(data){
authid = data["authid"];
var csrftoken = $.cookie('csrftoken');
console.log(csrftoken);
$.ajaxSetup({
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
});
url = "http://localhost:8000/v1/file".replace("{authid}", authid).replace("{token}", csrftoken)
$.post(url, function(data){
})
})
})
Run Code Online (Sandbox Code Playgroud)
您是如何通过向 Django 服务器发送 POST 请求来克服 Django CSRF 的?
谢谢!
我在 Django REST Framework 中使用 TokenAuthentication 来让脚本远程访问我的 API。运行 API 的域位于 TLS 证书后面。
在来到这里之前,我已经搜索了许多来源,并尝试了许多选择来找出我的问题是什么。简而言之,CSRF verification failed. Request aborted.当我尝试发帖时,我仍然收到错误。
这是我的观点:
# @csrf_exempt
@api_view(['POST'])
@authentication_classes((TokenAuthentication,))
@permission_classes((permissions.IsAuthenticated,))
def create_object(request):
Run Code Online (Sandbox Code Playgroud)
csrf_exempt装饰者在这里什么也没做。所以,我也在我的身上尝试过urls.py:
url(r'^create_object/', csrf_exempt(views.create_object),),
Run Code Online (Sandbox Code Playgroud)
我什至尝试编写一个自定义装饰器,并使用这个建议。即使当我这样做时,我似乎也无法在失败之前让装饰器执行。也许我的中间件的排序有问题?
'sslify.middleware.SSLifyMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'corsheaders.middleware.CorsPostCsrfMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.RemoteUserMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
Run Code Online (Sandbox Code Playgroud)
这是我的 django cors 设置:
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = ('example.com',)
CORS_REPLACE_HTTPS_REFERER = True
Run Code Online (Sandbox Code Playgroud) django django-csrf django-rest-framework django-cors-headers
我正在尝试登录管理面板,但收到 403 Forbidden 错误。上周没有出现错误。我没有改变任何东西。我几乎尝试了 StackOverFlow 中相同问题的所有解决方案。请帮我!谢谢阅读。我为我糟糕的英语道歉。
\n\n系统:
\n\nUbuntu 16.04\nPython 3.5\nDjango 2.0\nGunicorn\nNginx\niRedMail\nRun Code Online (Sandbox Code Playgroud)\n\ndjango 调试.log
\n\n Exception while resolving variable \'is_popup\' in template \'admin/login.html\'.\nTraceback (most recent call last):\n File "/home/xxx/xxx/xxx/lib/python3.5/site-packages/django/template/base.py", line 829, in _resolve_lookup\n current = current[bit]\n File "/home/xxx/xxx/xxx/lib/python3.5/site-packages/django/template/context.py", line 83, in __getitem__\n raise KeyError(key)\nKeyError: \'is_popup\'\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File "/home/xxx/xxx/xxx/lib/python3.5/site-packages/django/template/base.py", line 835, in _resolve_lookup\n if isinstance(current, BaseContext) and getattr(type(current), bit):\nAttributeError: type object \'RequestContext\' has no attribute \'is_popup\'\n\nDuring handling …Run Code Online (Sandbox Code Playgroud) 我正在将 Django Rest Framework 与 CSRF 结合使用。POST和PUT方法按预期工作,但DELETE给出错误 403 - 以下消息“{"detail":"CSRF Failed: CSRF token missing or incorrect."}.
看来前端应用程序(Angular)正在执行正确的POST请求PUT。我没有遇到任何与CSRFNor相关的问题CORS。
删除请求:
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,pl;q=0.8
Cache-Control: no-cache
Connection: keep-alive
Cookie: _ga=GA1.1.1418236812.1564012825; _gid=GA1.1.747517255.1564126213; sessionid=zho7t6c8vbot46uuwka8ufh53pkanein; _gat_gtag_UA_127399308_1=1;
X-XSRF-TOKEN=hapGqQ09lXlVX7MORRsTfvkEkE79AddcSGI84RdYJEqqjFDF4wXsK4jdKPYpQzIp
Host: 127.0.0.1:4200
http-x-csrftoken: hapGqQ09lXlVX7MORRsTfvkEkE79AddcSGI84RdYJEqqjFDF4wXsK4jdKPYpQzIp
Origin: http://127.0.0.1:4200
Pragma: no-cache
Referer: http://127.0.0.1:4200/cost_center/form/e503dbfd-8eae-49e4-becc-4aa60016b996
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36
x-csrftoken: hapGqQ09lXlVX7MORRsTfvkEkE79AddcSGI84RdYJEqqjFDF4wXsK4jdKPYpQzIp
Run Code Online (Sandbox Code Playgroud)
删除响应标头: …
我正在尝试使用 csrf 令牌向我的 Django 应用程序发送 JSON 请求,但我不知道如何操作。我已将令牌放入可以引用的变量中,但我不知道如何使用 fetch 通过 JSON 请求发送它。我已添加'csrfmiddlewaretoken': csrftoken到正文的 JSON.stringify 部分,但仍然收到错误消息 403 Forbidden。有人可以帮我解决这个问题吗?谢谢你!(抱歉代码上有奇怪的缩进)
JavaScript 文件:
fetch('/update', {
method: 'PUT',
body: JSON.stringify({
'csrfmiddlewaretoken': csrftoken,
'liked': true,
'post_id': parseInt(button.dataset.post_id)
})
})
Run Code Online (Sandbox Code Playgroud)
视图.py:
data = json.loads(request.body)
try:
content = data.get('content')
except:
JsonResponse({'error': 'content required'}, status=400)
try:
id = data.get('id')
post = Post.objects.get(id=id)
except:
JsonResponse({'error': 'post not found'}, status=400)
if request.user == post.user:
post.content = content
post.save()
return JsonResponse({'message': f'received: {content}'})
return JsonResponse({'error': "can't edit this user's posts"}, status=403)
Run Code Online (Sandbox Code Playgroud) 我经常测试我的应用程序使用curl过去,我不得不简单地用我的视图包装csrf_exempt.我真的不想这样做,因为我有一种讨厌的感觉,我会忘记在部署中这样做,享受一生的CSRF地狱.
有没有办法让我使用Django的shell命令请求CSRF令牌?我希望得到一个我可以发送的令牌curl以安全地测试事物.
我目前的设置是AngularJS + Django 1.5,我完全抛弃了Django模板引擎的使用(即后端几乎是一个API服务器).
由于我没有使用csrf_token模板标签,因此Django不会设置并发送csrftokencookie作为响应.根据官方文档的指示,ensure_csrf_cookie()装饰器应该用于强制装饰视图发送csrftokencookie.
我已将ensure_csrf_cookie()装饰器应用于视图,该视图提供了我的Web客户端在引导时调用的第一个GET请求.有了这个,我的Web客户端获得了CSRF令牌,因此允许将不安全的方法(例如POST)调用到服务器.
仅当CSRF令牌保持不变直到浏览会话结束时,上述设置才能正常工作.
问题: Django的CSRF令牌是否在浏览会话期间得到更新?如果'是',这是否意味着我需要将ensure_csrf_cookie()装饰器应用于我拥有的所有视图?
我遇到了一个奇怪的问题。我正在编写一个简单的小应用程序,需要将一些内容发布回 django 视图。我正在遵循此处的指南:https : //docs.djangoproject.com/en/1.7/ref/contrib/csrf/设置 ajax 标头并在我的 js 中包含以下代码:
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken'); …Run Code Online (Sandbox Code Playgroud) 我是Django的新手.我的项目名称是rango,我创建了一个名为'/ rango/tagger'的URL,它应该发送一个对象.
在我的java脚本中,我尝试通过向它发送ajax请求来与此路由进行通信,如下所示:
function send()
{
obj = {content:$("#content").val()};
$.post('/rango/tagger',obj,function(data){
console.log(data);
})
}
Run Code Online (Sandbox Code Playgroud)
我在我的模板中添加了{%csrf_token%}.但是,它给我的错误如下:
Forbidden (CSRF token missing or incorrect.): /rango/tagger
[31/Jan/2016 09:43:29] "POST /rango/tagger HTTP/1.1" 403 2274
Run Code Online (Sandbox Code Playgroud)
我在views.py中的函数标记器如下:
def tagger(request):
return render(request,'rango/index.html',RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
我也在我的网址模式中定义了它.我怀疑我的函数标记器返回了一个不正确的值或数据(根据其他SO解决方案从HttpResponse(请求)更改为上面的行).
但是,它似乎对我不起作用.我哪里错了?
因此,我在Django中返回一个失败测试,当时将预期与实际html与表单输入进行比较,因此我打印出结果并意识到差异是由我引起的相当简单的行,{% csrf_token %}如下所示:
<input type='hidden' name='csrfmiddlewaretoken' value='hrPLKVOlhAIXmxcHI4XaFjqgEAMCTfUa' />
Run Code Online (Sandbox Code Playgroud)
所以,我希望得到一个简单的答案,但我无法找到它:如何渲染csrf_token的结果用于测试?
这是测试设置和失败:
def test_home_page_returns_correct_html_with_POST(self):
request = HttpRequest()
request.method = 'POST'
request.POST['item_text'] = 'A new list item'
response = home_page(request)
self.assertIn('A new list item', response.content.decode())
expected_html = render_to_string(
'home.html',
{'new_item_text': 'A new list item'},
******this is where I'm hoping for a simple one-line mapping******
)
self.assertEqual(response.content.decode(), expected_html)
Run Code Online (Sandbox Code Playgroud)
这是来自views.py的渲染:
def home_page(request):
return render(request, 'home.html', {
'new_item_text': request.POST.get('item_text'),
})
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,这是测试失败 python manage.py test
FAIL: test_home_page_returns_correct_html_with_POST (lists.tests.HomePageTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud) django-csrf ×10
django ×9
csrf ×4
python ×3
ajax ×2
cors ×1
django-admin ×1
django-views ×1
javascript ×1
json ×1
post ×1
tdd ×1