django中post出现403的解决办法
- 格式:docx
- 大小:22.55 KB
- 文档页数:4
django如何解决500-Internalservererror.Internal server error 500 这个蛋疼烦人的错误一出现,大概你就想砸电脑了吧。
因为这个错误引发的源头实在太多了,(本人,常遇到的后台的py文件有错误,包括一些很不可思议的格式错误)于是在网上找了半天终于找到了个还不错的解决方法【转自 /chenggong2dm/article/details/7633667】使用python的pyamf客户端连接服务器的时候,只报出这样的错误:pyamf.remoting.RemotingError: HTTP Error 500: INTERNAL SERVER ERROR如果只看这个错误,会一头雾水的。
必须得让报错更明细一些。
想了想,有两个办法让错误定位,一个是更改pyamf源码,一个是更改django的源码,让django直接打印出来500错误信息。
这里用第二种想法实现了一下。
django处理500的源码:python2.7/site-packages/django/core/handlers/base.py源码如下, 中间那段是我添加的,这样可以显示出来详细错误了:def handle_uncaught_exception(self, request, resolver, exc_info):"""Processing for any otherwise uncaught exceptions (those that willgenerate HTTP 500 responses). Can be overridden by subclasses who wantcustomised 500 handling.Be *very* careful when overriding this because the error could becaused by anything, so assuming something like the database is alwaysavailable would be an error."""from django.conf import settingsif settings.DEBUG_PROPAGATE_EXCEPTIONS:raiselogger.error('Internal Server Error: %s', request.path,exc_info=exc_info,extra={'status_code': 500,'request': request})#============= Code start ========== by chang print "---------- HTTP 500 Error Msg ---------- "print exc_infoimport tracebackprint traceback.format_exc()print "---------------------------------------- "#============= Code end =========if settings.DEBUG:from django.views import debugreturn debug.technical_500_response(request, *exc_info)# If Http500 handler is not installed, re-raise last exception if resolver.urlconf_module is None:raise exc_info[1], None, exc_info[2]# Return an HttpResponse that displays a friendly error message.callback, param_dict = resolver.resolve500()return callback(request, **param_dict)。
Django中ajax发送post请求,报403错误CSRF验证失败解决办法今天学习Django框架,⽤ajax向后台发送post请求,直接报了403错误,说CSRF验证失败;先前⽤模板的话都是在⾥⾯加⼀个 {% csrf_token %} 就直接搞定了CSRF的问题了;很显然,⽤ajax发送post请求这样就⽩搭了;⽂末已经更新更简单的⽅法,上⾯的略显⿇烦上⽹上查了⼀下,看了⼏个别⼈的博客,才知道官⽹也早有说明解决办法,⼤致流程就是:就是新建⼀个JavaScript⽂件,然后把⽹上给的代码粘贴进去,然后在你使⽤ajax的页⾯把它引⼊⼀下;当然,如果你在⽹上找到的解决代码包含JQuery的话,那就需要在引⼊的JQuery之后引⼊了(毕竟解决代码不唯⼀,⽹上⼀找⼀堆,基本都是对的,原⽣JS和带JQuery的都有);⽂末会附上我使⽤的JS相关代码,也可以去⽹上找!如果上述没有解决你的问题,那就说明你和我踩了同样的⼀个⼩坑........⽤了上⾯查到的⽅法,直接就解决了我的问题,但是随着我对代码修修改改、清除了相关页⾯的cookie,吃个饭再运⾏,竟然⼜报403的CSRF错误了;百思不得其解的我⼜去Django官⽹看了⼀下相关部分的⽂档,⼀堆英⽂看看⼤概找到了问题;我发现我把html页⾯⾥⾯原先加的 {% csrf_token %} 这个东西给删掉了,加上⾕歌的相关页⾯cookie被我⼀清除,csrftoken就被咔嚓了,再刷新页⾯,去html页⾯⾥也找不到 {% csrf_token %} ,没有了csrftoken那个cookie值,即使有相关的JS代码也⽑⽤没有了;打个⽐⽅:你吃饭需要⼯具,也就是筷⼦,但是饭都没有,你拿个筷⼦吃什么呀这⾥的筷⼦就是解决问题的JS代码,⽽饭就是这个 {% csrf_token %} ,更确切说因该是浏览器中的叫 csrftoken 的 cookie;两者都有了,才能彻底解决吃饭的问题;总结下来:使⽤ajax发送post请求时,html页⾯⾥⼀定要有 {% csrf_token %},在body⾥应该就没什么⼤问题;然后引⼊相关的JS解决代码;补充⼀下,和表单没什么太⼤关系,因为我的html页⾯⾥就没有表单,直接通过点击按钮发送的ajax请求;需要引⼊的相关JS代码1 $(document).ajaxSend(function(event, xhr, settings) {2function getCookie(name) {3var cookieValue = null;4if (document.cookie && document.cookie != '') {5var cookies = document.cookie.split(';');6for (var i = 0; i < cookies.length; i++) {7var cookie = jQuery.trim(cookies[i]);8// Does this cookie string begin with the name we want?9if (cookie.substring(0, name.length + 1) == (name + '=')) {10 cookieValue = decodeURIComponent(cookie.substring(name.length + 1));11break;12 }13 }14 }15return cookieValue;16 }17function sameOrigin(url) {18// url could be relative or scheme relative or absolute19var host = document.location.host; // host + port20var protocol = document.location.protocol;21var sr_origin = '//' + host;22var origin = protocol + sr_origin;23// Allow absolute or scheme relative URLs to same origin24return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||25 (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||26// or any other URL that isn't scheme relative or absolute i.e relative.27 !(/^(\/\/|http:|https:).*/.test(url));28 }29function safeMethod(method) {30return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));31 }3233if (!safeMethod(settings.type) && sameOrigin(settings.url)) {34 xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));35 }36 });简单⽅法⾸先在你需要发起ajax post请求的页⾯的⾥⾯随便⼀个地⽅加上 {% crsr_token %}然后浏览器⾥查看源码,会有这么⼀个隐藏标签:<input type="hidden" name="csrfmiddlewaretoken"value="jlYb5LCP21TxGapw7OuO0xbHmRnyFzlgDapiDl1M1Vp6dOjPM4BlHOgOVeuPYQ27">在发起ajax post 请求时,组织json参数时,以下⾯这种⽅式使其成为参数,前两个参数是我⾃定义的请⾃⾏忽略,其中键值对中的键名为input标签的name名,值就为其value值csrf = $('input[name="csrfmiddlewaretoken"]').val();params = {'sku_id': sku_id, 'count': count, 'csrfmiddlewaretoken': csrf};这样就可以把csrf中的参数传递给后端,就不会有403错误了,相⽐前⾯⽤了好⼤⼀段JS代码要简洁的多。
基于Django静态资源部署404的解决⽅法⼀. 静态资源static⽂件放在app中确认django.contrib.staticfiles包含在INSTALLED_APPS中。
在settings⽂件中定义STATIC_URL,例如:STATIC_URL = '/static/'在模板中,可以硬编码URL如/static/my_app/example.jpg,或者最好使⽤static模板标签通过配置的STATICFILES_STORAGE存储来构建给定相对路径的URL(当你要切换到⽤于提供静态⽂件的内容分发⽹络(CDN)时,这样做会更容易)。
{% load static %}<img src="{% static "my_app/example.jpg" %}" alt="My image"/>在你的应⽤中,将静态⽂件存储在名为static的⽬录下。
例如my_app/static/my_app/example.jpg。
⼆. 静态资源static放在任意⽬录中(使⽤此⽅法解决404错误)你的项⽬可能还有⼀些静态⽂件不属于任何⼀个特定的应⽤。
除了在应⽤中使⽤static/⽬录,你还可以在settings⽂件中定义⼀个⽬录列表(STATICFILES_DIRS),Django会在其中查找静态⽂件。
像这样:STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"),'/var/www/static/',]以上这篇基于Django静态资源部署404的解决⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
Django配置404页⾯⼀.settings配置1.⾸先需要在settings中将DEBUG由原来的True改为FalseDEBUG = False2.需要设置ALLOWED_OSTS = ["*"]⼆.url设置三.views中设置def page_not_found(request,**kwargs):return render_to_response('404.html')上⾯就是配置404的全部过程四.最后附⼀个404页⾯的模板。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>错误页⾯</title><link rel="stylesheet" type="text/css" href="/static/css/404.css"/></head><body style="background:#0186a7;"><!---404---><div class="error_new_bg pr"><div class="error_new_content"><div class="error_new pa"><div class="fl error_new_left"><img src="/static/img/404.png"></div><div class="fl error_new_right"><div class="error_detail"><p class="error_p_title">哎呦~ 页⾯没有找到!</p><p class="error_p_con">※别急,⼯程师正在紧急处理,马上就好。
REST框架的视图处理了各种异常,并正确地返回了响应。
被处理的异常有:Rest框架内部抛出的APIException的子类。
Django的Http404异常。
Django的PermissionDenied异常针对每种情况,REST框架将返回一个包含了正确的状态码和content-type的响应。
响应体包含了任何关于本身的额外细节。
部分的响应将在响应体中包含了一个detail的键。
例如请求:DELETEhttp://api.example./foo/barHTTP/1.1Accept:application/json你还可能接收到一个响应,表明对该资源DELETE方法不允许的。
HTTP/1.1405MethodNotAllowedContent-Type:application/jsonContent-Length:42{"detail":"Method'DELETE'notallowed."}校验的处理有些轻微的不同,它会把字段的名字作为键包含进来。
如果校验没有被指定到一个特定的字段,那么它会使用non_field_errors作为键,或者你在setting文件中设定的NON_FIELD_ERRORS_KEY任意字符串的值。
任何校验将类似的形式:HTTP/1.1400BadRequestContent-Type:application/jsonContent-Length:94{"amount":["Avalidintegerisrequired."],"description":["Thisfieldmaynotbeblank."]} 自定义异常处理你可以实现你的自定义异常处理。
可以通过创建一个异常处理函数将API视图中抛出的异常转换成响应对象。
这样一来,你就可以控制你的API使用的响应格式。
post 参数过长请求403
当在进行网络请求时,如果post参数过长可能会导致服务器返回403错误。
这通常是因为服务器对post参数的大小进行了限制,超出限制的请求会被拒绝。
造成post参数过长的原因可能是在向服务器发送数据时,post参数的大小超出了服务器的设定限制。
这个限制通常是为了防止恶意攻击或者防止服务器过载。
要解决这个问题,首先需要确认服务器对post参数大小的限制是多少,可以查看服务器的配置或者联系服务器管理员。
一旦确定了限制,可以考虑减少post参数的大小,可以将一部分数据改为放在请求头中,或者压缩数据等方式来减小post参数的大小。
另外,也可以考虑将大数据拆分成多个小数据分批发送,这样可以避免post参数过长的问题。
另外,还可以考虑使用其他方法来传递数据,例如使用GET请求,将数据放在URL中进行传递。
但是需要注意的是,使用GET请求会将数据暴露在URL中,安全性较低,不适合传输敏感数据。
除了减小post参数的大小和使用其他方法传递数据外,还可以考虑优化服务器的配置,放宽post参数大小的限制。
当然,这需要
有权限去修改服务器的配置,如果是在共享主机上,可能无法进行此项操作。
总之,当遇到post参数过长导致请求403的问题时,需要确认服务器的post参数大小限制,然后可以通过减小参数大小、拆分数据、使用其他传输方式或者优化服务器配置等方式来解决问题。
希望以上建议能够帮助你解决这个问题。
解决Ajax发送post请求出现403Forbidden的三种⽅式众所周知前端向后台发送 post 请求时,必须验证csrf,否则会报错403 Forbidden。
使⽤ Django Form 表单可以直接在表单⾥⾯添加{% csrf_token %}即可,要是通过 Ajax 发送请求⼜该怎么办?下⾯提供三种解决办法:<ul id="ddd"><li>1</li><li>2</li><li>3</li></ul><button id="btn" type="button">Ajax 发送</button>1. ⽅式⼀<script src="{% static 'js/jquery-3.1.1.js' %}"></script><script>$('#btn').click(function () {var li_content = [];$('#ddd').children('li').each(function () {li_content.push($(this).html());});console.log(li_content);$.ajax({url: '/webs/test_json/',type: 'post',data: {'li_list': JSON.stringify(li_content),csrfmiddlewaretoken: '{{ csrf_token }}' // 添加这句},success: function (arg) {console.log(arg);}})})</script>2. ⽅式⼆⽅式⼆仅在 Django 中适⽤,因为{% csrf_token %}是 Django 的模板语⾔,它会⽣成⼀个隐藏的input标签<ul id="ddd">{% csrf_token %} <!--添加这句会⽣成⼀个隐藏的 input 标签,name='csrfmiddlewaretoken'--><li>1</li><li>2</li><li>3</li></ul><button id="btn" type="button">Ajax 发送</button><script src="{% static 'js/jquery-3.1.1.js' %}"></script><script>$('#btn').click(function () {var li_content = [];$('#ddd').children('li').each(function () {li_content.push($(this).html());});console.log(li_content);$.ajax({url: '/webs/test_json/',type: 'post',data: {'li_list': JSON.stringify(li_content),csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() // 添加这句,去获取 input 的值},success: function (arg) {console.log(arg);}})})</script>3. ⽅式三因为cookie中同样存在csrftoken,所以可以在js中获取:$.cooke("cstftoken"),并将其添加到请求头中发送。
Django⾃定义全局403、404、500错误页⾯的⽰例代码⾃定义模板403<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>403-禁⽌访问</title></head><body>HTTP 403 - 禁⽌访问</body></html>404<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>404-⽆法找到⽂件</title></head><body>HTTP 404- ⽆法找到⽂件</body></html>500<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>500-服务器错误</title></head><body>HTTP 500 - 内部服务器错误</body></html>编写视图# 全局403、404、500错误⾃定义页⾯显⽰def page_not_found(request):return render(request, '404.html')def page_error(request):return render(request, '500.html')def permission_denied(request):return render(request, '403.html')修改urlfrom .views import page_error, page_not_found, permission_deniedurlpatterns = [# ...]# 定义错误跳转页⾯handler403 = permission_deniedhandler404 = page_not_foundhandler500 = page_error尝试使⽤⽆权限⽤户访问,看是否会显⽰该页⾯如果不对,修改settings.py中的DEBUG的值DEBUG = False注:若是DEBUG=True,有些情况下则不会⽣效Http404抛出异常raise Http404('资源不存在<id:{}>,请访问 xxx 查看')模板中捕获异常信息使⽤{{ exception }}即可捕获异常信息,转换为html代码{{ exception|safe }},可以根据这些代码中的id等,得到跳转的链接,参考<!DOCTYPE html>{% load static %}<html lang="en"><style type="text/css">.pic {margin: auto;position: absolute;top: 0;left: 0;bottom: 0;right: 0;}</style><head><meta charset="UTF-8"><title>404-⽆法找到⽂件</title><link href="///toastr.js/latest/css/toastr.min.css" rel="external nofollow" rel="stylesheet"></head><body><a href="//" rel="external nofollow" ><img class="pic" src="{% static 'errors/404.gif' %}"></a><p hidden>{{ exception|safe }}</p><script src="///jquery-3.1.1.min.js"></script><script src="///toastr.js/latest/js/toastr.min.js"></script><script>toastr.options = { // toastr配置"closeButton": true,"debug": false,"progressBar": true,"positionClass": "toast-top-center","showDuration": "400","hideDuration": "1000","timeOut": "7000","extendedTimeOut": "1000","showEasing": "swing","hideEasing": "linear","showMethod": "fadeIn","hideMethod": "fadeOut"};$(function () {let redirect_url = $('#redirect_url').text();if (redirect_url.indexOf('//') === 0 || redirect_url.indexOf('http') === 0) { // ⼀链接开头才跳转toastr.warning('{{ exception|safe }}', '跳转中');setTimeout(function () {//这⾥写时间到后执⾏的代码$(location).attr('href', redirect_url);}, 3000);}})</script></body></html>后端raise Http404('访问资源不存在,即将跳转 <span id="redirect_url">{}</span>'.format(''))那么当出现404错误是,jquery就获取该di的值,如果是//或者是http开头,表明可能是个链接(后端请限制格式),前端直接跳转到此这篇关于Django⾃定义全局403、404、500错误页⾯的⽰例代码的⽂章就介绍到这了,更多相关Django 403、404、500错误页⾯内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
DjangoPOST提交问题解决问题在使⽤Django搭建好测试环境后,写了⼀个提交POST表单提交留⾔的测试页⾯。
如图:填写表单,点击“提交留⾔”按钮提交到服务器,却出现Forbidden (403)CSRF verification failed. Request aborted.由于之前使⽤GET⽅式提交表单内容测试均正常,就以为这个问题估计是配置问题没细看后边的帮助提⽰直接在⽹上搜索解决⽅案。
⼀搜索发现相关⽹页很多,看来⼤家都遇到过这个问题,想着应该很快能解决。
解决⽅案1:失败在settings.py的MIDDLEWARE_CLASSES加⼊'django.middleware.csrf.CsrfResponseMiddleware',最终settings.py MIDDLEWARE_CLASSES 配置部分的代码如下:1234 5 6 7 8 9101112保存,重新加载http://127.0.0.1/comment/add页⾯提交留⾔测试。
但在打开页⾯时出现500错误赶紧看了⼀下控制台,发现如下错误1 2 3 4 5 6 7 8 910111213141516⼤致的意思是我刚才在settings.py的MIDDLEWARE_CLASSES内添加的'django.middleware.csrf.CsrfResponseMiddleware',这个模块找不到,当时就有点郁闷了。
⽹上⼀⼤堆都说是添加这个模块解决问题的,现在我本机上添加这个模块以后却提⽰没有找到模块?为此,我重新把Django重新安装了⼀遍还是提⽰找不到模块。
我只好到官⽹去看看⼿册,才发现Django新版已去掉这个模块。
⽽我的Django正好是最新版本1.4只好放弃这个⽅案!解决⽅案2:失败在视图⾥使⽤@csrf_protect修饰于是我在views.py⽂件⾥的add函数前加了@csrf_protect修饰符,如下代码:打开留⾔页⾯发现⼜有⼀个错误提⽰NameError at /comment/add/name 'csrf_protect' is not defined提⽰找不到我刚才添加的修饰符@csrf_protect,应该是没有导⼊相关模块的问题,于是在我的视图views.py头部添加了⼀句代码导⼊相关模块from django.views.decorators.csrf import csrf_protect保存⽂件,重新打开⽹页,错误已清除。
modelstatedictionary返回403标题:ModelStateException: Understanding the Causes and Solutions for a 403 Error引言概述:在Web开发中,经常会遇到ModelStateException的错误,特别是当使用ModelStateException返回403错误时,这可能会导致用户无法访问特定的资源或执行特定的操作。
本文将详细探讨ModelStateException返回403错误的原因以及解决方案。
正文内容:1. 原因1.1 无效的验证令牌:403错误可能是由于无效的验证令牌引起的。
验证令牌是一种用于防止跨站请求伪造(CSRF)攻击的安全机制。
如果验证令牌无效或过期,服务器将返回403错误。
1.2 权限不足:403错误还可能是由于权限不足引起的。
当用户试图访问受限资源或执行受限操作时,服务器会返回403错误,表示用户没有足够的权限。
1.3 请求格式错误:在某些情况下,服务器可能会要求特定的请求格式。
如果请求格式与服务器要求的格式不匹配,服务器将返回403错误。
1.4 IP限制:某些服务器可能会根据IP地址限制对特定资源的访问。
如果用户的IP地址在服务器的限制列表中,服务器将返回403错误。
1.5 安全策略限制:服务器可能会实施特定的安全策略,例如HTTP严格传输安全性(HSTS)策略。
如果用户的请求不符合服务器的安全策略要求,服务器将返回403错误。
2. 解决方案2.1 检查验证令牌:确保验证令牌有效且未过期。
可以通过生成新的验证令牌或更新现有的验证令牌来解决此问题。
2.2 检查权限设置:确保用户具有足够的权限来访问特定资源或执行特定操作。
可以通过更新权限设置或授予用户所需的权限来解决此问题。
2.3 检查请求格式:确保请求格式与服务器要求的格式匹配。
可以通过检查请求的内容类型和数据格式来解决此问题。
2.4 检查IP限制:如果服务器实施了IP限制,确保用户的IP地址不在限制列表中。
http403错误解决方案IIS默认安装时“启用默认文档”列表中不包含index.asp,而现在很多网站都是以这个文件作为开始页面,所以要记得添加,不然就会出现"HTTP 错误403 - 禁止访问"。
“HTTP 错误403 ”会有很多原因,这只是一个原因。
附:400 无法解析此请求。
401.1 未经授权:访问由于凭据无效被拒绝。
401.2 未经授权: 访问由于服务器配置倾向使用替代身份验证方法而被拒绝。
401.3 未经授权:访问由于ACL 对所请求资源的设置被拒绝。
401.4 未经授权:Web 服务器上安装的筛选器授权失败。
401.5 未经授权:ISAPI/CGI 应用程序授权失败。
401.7 未经授权:由于Web 服务器上的URL 授权策略而拒绝访问。
403 禁止访问:访问被拒绝。
403.1 禁止访问:执行访问被拒绝。
403.2 禁止访问:读取访问被拒绝。
403.3 禁止访问:写入访问被拒绝。
403.4 禁止访问:需要使用SSL 查看该资源。
403.5 禁止访问:需要使用SSL 128 查看该资源。
403.6 禁止访问:客户端的IP 地址被拒绝。
403.7 禁止访问:需要SSL 客户端证书。
403.8 禁止访问:客户端的DNS 名称被拒绝。
403.9 禁止访问:太多客户端试图连接到Web 服务器。
403.10 禁止访问:Web 服务器配置为拒绝执行访问。
403.11 禁止访问:密码已更改。
403.12 禁止访问:服务器证书映射器拒绝了客户端证书访问。
403.13 禁止访问:客户端证书已在Web 服务器上吊销。
403.14 禁止访问:在Web 服务器上已拒绝目录列表。
403.15 禁止访问:Web 服务器已超过客户端访问许可证限制。
403.16 禁止访问:客户端证书格式错误或未被Web 服务器信任。
403.17 禁止访问:客户端证书已经到期或者尚未生效。
403.18 禁止访问:无法在当前应用程序池中执行请求的URL。
modelstatedictionary返回403怎么解决HTTP 403错误通常表示禁止访问,即服务器理解请求,但拒绝处理请求。
在中,`ModelStateDictionary`通常用于验证模型状态,而403错误可能是由于权限问题引起的。
以下是一些可能的解决方案:1. 检查身份验证和授权:确保用户已经通过身份验证,并且具有执行请求所需的权限。
在中,你可以使用`Authorize` 属性来限制访问控制。
```csharp[Authorize]public IActionResult YourAction(){// Your action logic here}```2. 检查模型状态:如果`ModelState`验证失败,可能会导致请求被拒绝。
在控制器中,你可以使用`ModelState.IsValid` 进行检查,并相应地处理错误。
```csharppublic IActionResult YourAction(YourModel model){if (ModelState.IsValid){// Your action logic here}else{// Handle validation errorsreturn BadRequest(ModelState);}}```3. 检查角色和策略:如果你在应用中使用了角色或策略控制访问权限,确保用户被分配到了正确的角色,并且策略允许执行该操作。
4. 查看日志:在服务器日志中查找更多信息,了解403错误的具体原因。
这可能包括权限问题、认证失败等。
查看服务器日志可以提供更详细的错误信息,有助于解决问题。
5. 调试前端代码:如果403错误是通过前端发起的请求引起的,检查前端代码,确保请求头、身份验证标头等设置正确。
在浏览器开发者工具中查看网络请求和响应信息也可能有助于识别问题。
6. 查看CORS设置:如果你的应用涉及跨域请求(CORS),确保在服务器端配置了正确的CORS策略。
django post出现403的解决办法
据说,从django1.x开始,加入了CSRF保护。
CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。
尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。
XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。
与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
-------来自百度百科
报错:
Forbidden (403)
CSRF verification failed. Request aborted.
Help
Reason given for failure:
CSRF token missing or incorrect.
In general, this can occur when there is a genuine Cross Site Request Forgery, or when Django's CSRF mechanism has not been used correctly. For POST forms, you need to ensure:
∙Your browser is accepting cookies.
∙The view function uses RequestContext for the template, instead of Context.
∙In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.
∙If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.
You're seeing the help section of this page because you have DEBUG = True in your Django settings file. Change that to False, and only the initial error message will be displayed.
You can customize this page using the CSRF_FAILURE_VIEW setting.
在网上找解决办法,说是提交参数中要有csrf_token,才能成功。
但网上都是1.3或者1.4版本的解决办法,在1.5版本中测试已经不能用了。
在1.5.1版本,我测试可行的解决办法有三种:
一:
关闭csrf保护功能。
为视图函数添加@csrf_exempt修饰符。
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def view(request):
#your code.....
当然这样不安全。
二:
在模版文件中,每个form提交域中都加上{% csrf_token %}标签,并使用render函数返回视图,或者强行使用RequestContext 代替Context。
例:
from django.shortcuts import render
def contact(request):
form = ContactForm()#这里我使用了一个django的表格
return render(request,'contact.html', {'form': form})
或者:
from django.shortcuts import render_to_response
def contact(request):
form = ContactForm()#这里我使用了一个django的表格
return render_to_response('contact.html',
{'form': form},
context_instance=RequestContext(request)
)
contact.html的内容:
<html>
<head>
<style type="text/css">
ul.errorlist {
margin: 0;
padding: 0;
}
.errorlist li {
background-color: red;
color: white;
display: block;
font-size: 10px;
margin: 003px;
padding: 4px5px;
}
</style>
<title>send</title>
</head>
<body>
<h1>Contact us</h1>
<form action=""method="post">
{% csrf_token %}
<div class="field">
{{ form.subject.errors }}
<label for="id_subject">工作:</label>
{{ form.subject }}
</div>
<div class="field">
{{ form.email.errors }}
<label for="id_email">你的邮箱地址:</label>
{{ form.email }}
</div>
<div class="field">
{{ form.message.errors }}
<label for="id_message">消息:</label>
{{ form.message }}
</div>
<input type="submit"value="Submit">
</form>
</body>
</html>
三:
方法二显然只能限制在django模版中使用,那如果我们使用javascript或者AJAX的时候呢?怎么添加csrf_token呢?
我们可以使用javascript来提取cookies中的csrf_token。
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]);
if (cookie.substring(0, name.length+1) == (name +'=')) {
cookieValue =decodeURIComponent(cookie.substring(name.length+1));
break;
}
}
}
return cookieValue;
}
或者这个好理解的:
function getCookie(sName){
var aCookie=document.cookie.split("; ");
for(var i=0;i<aCookie.length;i++){
var aCrumb=aCookie[i].split("=");
if(sName==aCrumb[0])return (aCrumb[1]);
}
return null;
}
AJAX中这样用:
$.post(url,
{"csrfmiddlewaretoken":getCookie('csrftoken')},
function (data) {alert(data);});
但是有一个问题,当有一个新用户访问这个页面的时候,cookie里并没有csrftoken这个值。
只有进行第二种方法,才能在cookie里生成csrftoken值。
解决此问题的方法随后更新。
完全可以满足简单的建站需要。