跨站请求伪造csrf
如何设置
你只要在写form表单的时候,只要在在表单中写一个{% csrf_token %}
''' <form action="" method="post"> {% csrf_token %} <p>username:<input type="text" name="username"></p> <p>target_account:<input type="text" name="target_user"></p> <p>money:<input type="text" name="money"></p> <input type="submit"> </form> 网站在返回给用户一个form表单的时候 会自动在该表单隐藏一个input框 这个框的value是一个随机字符串 但是网站能够记住每一个浏览器发送的随机字符串 '''
ajax设置
方式一(J较为繁琐):
''' 先在页面任意的位置上书写{% csrf_token %} 然后在发送ajax请求的时候 通过标签查找获取随机字符串添加到data自定义对象即可 data:{'username':'jj', 'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()}, '''
方式二(较为简单):
''' data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'}, '''
方式三(推荐):
''' 官网提供的文件 最通用的一种方式 直接兴建js文件拷贝代码 导入即可 你不需要做任何的csrf相关的代码书写 创建一个js文件:在static中创建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'); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function (xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } }); 前端:导入该文件 <script src='/static/set.up.js'><\script> '''
csrf相关装饰器
''' from django.views.decorators.csrf import csrf_exempt,csrf_portect @csrf_exempt # 不校验 csrf def index(request): return HttpResponse('index') @csrf_protect # 校验 def login(request): return HttpResponse('login') CBV中: # @method_decorator(csrf_exempt,name='post') # csrf_exempt不支持该方法 @method_decorator(csrf_exempt,name='dispatch') # csrf_exempt class MyIndex(views.View): # @method_decorator(csrf_exempt) # 可以 def dispatch(self, request, *args, **kwargs): return super().dispatch(request,*args,**kwargs) def get(self,request): return render(request,'transfer.html') # @method_decorator(csrf_exempt,name='post') # csrf_exempt不支持该方法 def post(self,request): return HttpResponse('OK') # csrf_exempt这个装饰器只能给dispatch装才能生效 """ csrf_protect方式全都可以 跟你普通的装饰器装饰CBV一致 """ # @method_decorator(csrf_protect,name='post') # 可以 class MyIndex(views.View): @method_decorator(csrf_protect) def dispatch(self, request, *args, **kwargs): return super().dispatch(request,*args,**kwargs) def get(self,request): return render(request,'transfer.html') # @method_decorator(csrf_protect) # 可以 def post(self,request): return HttpResponse('OK') '''
auth模块
''' 1.创建用户: from django.contrib.auth.models import User User.objects.create(username=username,password=password) # 不可用 密码不是加密的 User.objects.create_user(username=username,password=password) # 创建普通用户密码自动加密 User.objects.create_superuser(username=username,password=password ,email='123@qq.com') # 创建超级用户 需要邮箱数据 2.校验用户名和密码是否真确 from django.contrib import auth user_obj=auth.authenticate(request,username=username,password=password) # 返回的是布尔值 3.保存用户登录状态 auth.login(request,user_obj) 只要执行了这一句话,之后你可以在任意位置,通过request.user获取到当前登录用户对象 4.判断当前用户是否登录 reuqest.user.is_authenticare() 5.校验原来密码是否正确 request.user.check_password(old_password) 6.修改密码 request.user.set_password(new_password) 7.注销 auth.logout 8.校验用户是否登录装饰器 from django.contrib.auth.decorators import login_required 局部配置 @login_required(login_url='/login') def index(request): pass 全局配置 settings配置文件中直接配置 LOGIN_URL='/login' @login_required def index(request): pass # 如果全局配置了 局部也配置 以局部的为准 '''
如何拓展auth_user表字段
方式一:
利用一对一外键字段关系 class UserDetail(models.Model): phone = models.BigIntegerField() user = models.OneToOneField(to='User')
方式二:
利用继承关系 from django.contrib.auth.models import AbstractUser class Userinfo(AbstractUser): phone = models.BigIntegerField() register_time = models.DateField(auto_now_add=True) # 一定要注意 还需要去配置文件中配置 AUTH_USER_MODEL = 'app01.Userinfo' # 应用名.表名 # 这么写完之后 之前所有的auth模块功能全都以你写的表为准