csrf跨站请求伪造
钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻
eg:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户 并不是真正的四六级官方账户
模拟钓鱼网站案例:转账案例
内部隐藏标签
思考:如何区分真假网站页面发送的请求
csrf校验策略
在提交数据的位置添加唯一标识
1.form表单csrf策略
form表单内部添加{% csrf_token %}
2.ajax请求csrf策略
<script src="/static/myjs.js"></script>
<script>
$('#d1').click(function(){
$.ajax({
url:'',
type:'post',
// 方式1:自己动手取值 较为繁琐
{
// 方式2:利用模板语法自动获取(一定要引号引起来)
{
// 方式3:引用一个js脚本(官方提供)
data:{},
success:function(args){
}
})
})
</script>
参考:https://www.cnblogs.com/Dominic-Ji/p/9234099.html
csrf相关装饰器
整个django项目都校验csrf但是某些个视图函数\类不想校验
整个django项目都不校验csrf 但是某些个视图函数\类需要校验
FBV添加装饰器的方式(与正常函数添加装饰器一致)
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_protect
def transfer_func(request):pass
CBV添加装饰器的方式(与正常情况不一样 需要注意)
主要有三种方式(这三种方式都在配置里面全局csrf校验开着或者不开的情况下)
from django import views
from django.utils.decorators import method_decorator
class MyViews(views.View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request,*args,**kwargs)
def post(self,request):
return HttpResponse('from cbv post view')
注意有一个装饰器是特例只能有一种添加方式>>>:csrf_exempt
只有在dispathch方法添加才会生效
auth认证模块
前夕:django自带一个admin路由 但是需要我们提供管理员账户和密码
如果想要使用admin后台管理 需要先创建表 然后创建管理员账号
直接执行数据库迁移命令即可产生默认的auth_user表 该表就是admin后台管理默认的认证表
1.创建超级管理员
python38 manage.py createsuperuser
基于auth_user表编写用户相关的各项功能
登录、校验用户是否登录、修改密码、注销登录等
auth认证相关模块及操作
from django.contrib import auth
from django.contrib.auth.models import User
1.用户注册功能
def register_func(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
res = User.objects.filter(username=username)
if res:
return HttpResponse('用户名已存在')
User.objects.create_user(username=username,password=password)
return render(request,'registerPage.html')
2.判断用户名和密码是否正确
def login_func(request):
print(request.user)
print(request.user.is_authenticated)
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user_obj = auth.authenticate(request,username=username,password=password)
if user_obj:
auth.login(request,user_obj)
'''
当执行完上述的操作之后我们就可以通过request.user直接获取到当前登录的用户对象数据
'''
return HttpResponse('登录成功!!!')
return render(request,'loginPage.html')
3.判断用户是否登录
request.user.is_authenticated
4.获取登录用户对象数据
request.user
5.校验用户是否登录装饰器
from django.contrib.auth.decorators import login_required
@login_required
def index_func(request):
return HttpResponse('index页面,只有登录的用户才可以查看')
6.校验原密码是否正确
request.user.check_password(原密码)
7.修改密码
request.user.set_password(新密码)
request.user.save()
8.退出登录
auth.logout(request)
扩展auth_user表
还想使用auth模块的功能 并且又想扩展auth_user表的字段
思路1:一对一字段关联
思路2:替换auth_user表
步骤1:模型层编写模型类继承AbstractUser
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
phone = models.BigIntegerField()
desc = models.TextField()
步骤2:一定要在配置文件中声明替换关系
AUTH_USER_MODEL = 'app01.UserInfo'
ps:替换还有一个前提 就是数据库迁移没有执行过(需要一个新库,就是auth相关表没有创建)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类