目录
跨站请求伪造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模块功能全都以你写的表为准