前面我们写Django的时候,都要在settings.py里把CSRF注释掉,这里其实是Django提供的一层防护,防止提交的数据含有XSS攻击,只有请求里面含有CSRF令牌(随机字符串)才可以通过,否则会被禁止。这里不注释掉也可以写:
<form action="/login/" method="POST"> {% csrf_token %} <input type="text" name="user"/> <input type="password" name="pwd"/> <input type="checkbox" name="rmb" value="1"/>一天内免登录 <input type="submit" value="登录"/> </form>
ajax方式(提前配置ajax):
<body> <form action="/login/" method="POST"> {% csrf_token %} <input type="text" name="user"/> <input type="password" name="pwd"/> <input type="checkbox" name="rmb" value="1"/>一天内免登录 <input type="submit" value="登录"/> <input id="btn1" type="button" value="按钮"/> <input id="btn2" type="button" value="按钮"/> </form> <script src="/static/jquery-1.12.4.js"></script> <script src="/static/jquery.cookie.js"></script> <script> $(function(){ $.ajaxSetup({ beforeSend:function(xhr,settings){ xhr.setRequestHeader('X-CSRFtoken',$.cookie('csrftoken')) } }); $('#btn1').click(function () { $.ajax({ url: '/login/', type: 'POST', data: {'user': 'root', 'pwd': '123'}, success:function(arg){ } }) }); $('#btn2').click(function () { $.ajax({ url: '/login/', type: 'POST', data: {'user': 'root', 'pwd': '123'}, success:function(arg){ } }) }) }) </script> </body>
views.py里面也可以设置是否使用CSRF:
当全局设置了CSRF时候,这样可以取消:
from django.views.decorators.csrf import csrf_exempt, csrf_protect @csrf_exempt def index(request): if request.session.get('is_login', None): return render(request, 'index.html', {'username': request.session['username']}) else: return HttpResponse('错误')
当全局没有设置CSRF时候,这样可以添加:
from django.views.decorators.csrf import csrf_exempt, csrf_protect @csrf_protect def index(request): if request.session.get('is_login', None): return render(request, 'index.html', {'username': request.session['username']}) else: return HttpResponse('错误')