csrf跨站请求的相关装饰器、Auth模块(模块的使用、相关方法、退出系统、修改密码功能、注册功能)、扩展默认的auth_user表

一、csrf跨站请求的相关装饰器

'''
django.middleware.csrf.CsrfViewMiddlewareDjango中有一个中间件对csrf跨站做了验证,我只要把csrf的这个中间件打开,
那就意味着所有的方法都要被验证
'''在所有的视图函数中:只有几个视图函数做验证只有几个函数不做验证csrf_protect: 哪个视图函数加了这个装饰器,这个函数就会做验证
csrf_exempt:哪个视图函数加了这个装饰器,这个函数就不会做验证
-------------------------------------------------------------------------------
注意:加入装饰器验证csrf,先导入下面这行代码:
from django.views.decorators.csrf import csrf_exempt,csrf_protect一、FBV模式下:
情境11.先在settings.py配置文件中注释下面这行代码:# 'django.middleware.csrf.CsrfViewMiddleware',2.然后在需要验证的视图函数上面加上 @csrf_protect 则说明这个视图函数需要经过验证.@csrf_protectdef index(request):return render(request, 'index.html')def func(request):return render(request, 'func.html')3. 上述两个视图函数中,由于index函数加了装饰器csrf_protect所以需要经过csrf验证,而func函数不需要情境21.先打开settings.py配置文件中下面这行代码:即不用注释'django.middleware.csrf.CsrfViewMiddleware',2.然后在不需要验证的视图函数上面加上 @csrf_exempt 则说明这个视图函数不需要经过验证,而没有加任何装饰的视图函数必须经过csrf验证@csrf_exemptdef index(request):return render(request, 'index.html')def func(request):return render(request, 'func.html')return render(request, 'func.html')3. 上述两个视图函数中,在'django.middleware.csrf.CsrfViewMiddleware',没有被注释的情况下:由于index函数加了装饰器csrf_exempt,所以不需要经过csrf验证,而func函数需要csrf验证。情境31.在打开settings.py配置文件中下面这行代码的情况下:'django.middleware.csrf.CsrfViewMiddleware',2.然后在不需要验证的视图函数上面加上 @csrf_exempt 则说明这个视图函数不需要经过验证,而另一个加了装饰器 csrf_protect 的视图函数也必须经过csrf验证@csrf_exemptdef index(request):return render(request, 'index.html')@csrf_protectdef func(request):return render(request, 'func.html')3. 上述两个视图函数中,由于index函数加了装饰器csrf_exempt所以不需要经过csrf验证,而func函数加了装饰器csrf_protect需要csrf验证。二、CBV模式下:
注意:加入装饰器,先导入下面代码:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.views import View
from django.utils.decorators import method_decorator方式1:在post函数上,加入csrf_exempt无效,还是报错:Forbidden (403)1.先打开settings.py配置文件中下面这行代码:即不用注释'django.middleware.csrf.CsrfViewMiddleware',2.然后在不需要验证的视图函数上面加上 @csrf_exempt 则说明这个视图函数不需要经过验证,但是结果是还需要验证,说明此方式无效。class Login(View):# 不让post方法做验证@method_decorator(csrf_exempt)def post(self, request):print('post')return HttpResponse('post')方式2:在类的投诉,加入csrf_exempt无效,还是报错:Forbidden (403)1.先打开settings.py配置文件中下面这行代码:即不用注释'django.middleware.csrf.CsrfViewMiddleware',2.在类的头上加了装饰器,但是还是无效@method_decorator(csrf_exempt, name='post')class Login(View):# 不让post方法做验证def post(self, request):print('post')return HttpResponse('post')方式3:CBV的验证只有在dispatch函数上加装饰器,需要验证的函数才能通过验证class Login(View):@method_decorator(csrf_exempt)def dispatch(self, request, *args, **kwargs):return super(Login, self).dispatch(request, *args, **kwargs)# 不让post方法做验证def post(self, request):print('post')return HttpResponse('post')注意:在settings.py配置文件中注释下面这行代码:#'django.middleware.csrf.CsrfViewMiddleware',然后,对三种方式进行验证csrf_protect,都可以CBV针对于csrf_exempt:只有第三张方式才生效,其余两种方式不行
CBV针对于csrf_protect:三种方式都可以# @method_decorator(csrf_protect,name='post') # 第二种方式也行
class Login(View):@method_decorator(csrf_protect)  # 第三种方式可以def dispatch(self, request, *args, **kwargs):return super().dispatch(request, *args, **kwargs)# 不让post方法做验证# @method_decorator(csrf_protect)  # 第一种方式行def post(self, request):print("post")return HttpResponse("post")

二、Auth模块的使用

Auth模块是什么?Auth模块是Django自带的用户认证模块:我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统–auth,它默认使用 auth_user 表来存储用户数据。注意事项:在执行数据库迁移命令的时候,会自动生成一个默认的表,其中有auth_开头的很多表auth_user表的作用:djagno自带的后台管理系统所依赖的数据就在这张表中默认情况下,auth_user表是空表,没有用户名和密码,因此我们需要自己创建用户数据需要创建一个超级管理员账号才能登录'''
创建超级管理员命令:python manage.py createsuperuser在配置文件settings.py中修改语言为中文和时区:
# 语言
LANGUAGE_CODE = 'zh-hans'
# 时区
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False'''

三、Auth模块的相关方法

登录功能、注册功能、修改密码、退出系统、认证功能等学习如何使用# http://127.0.0.1:8000/accounts/login/?next=/order/
# @login_required # :http://127.0.0.1:8000/accounts/login/?next=/order/
'''当局部和全局都存在的时候,按局部的如果局部没有,按照全局的
'''
@login_required(login_url='/order/login/')  # 局部设置
def order(request):pass###################配置文件中全局配置LOGIN_URL = '/login/' # 全局配置'''
如果没有登录则 跳转到 http://127.0.0.1:8000/accounts/login/?next=/order/
但是若加了装饰器,则跳转到指定的路由页面在settings.py配置文件中全局配置,
LOGIN_URL = '/login/'当局部和全局都在的时候,按局部的,若局部没有,则按全局的
'''
@login_required(login_url='/login/')  # 局部设置登录
def order(request):# 验证用户是否已经登录认证print(request.user.is_authenticated)  # True# 若加了@login_required装饰器,则下面的判断不需要# if request.user.is_authenticated:#     # 处理登录之后的逻辑#     pass# else:#     # 没有登录,跳转登录页面#     passreturn HttpResponse('order')def order1(request):return HttpResponse('order')---------------------------------------------------------------------------------------auth模块的后端登录代码:
from django.contrib import authdef login(request):if request.method == 'POST':# 1.接收前端传过来的数据username = request.POST.get('username')password = request.POST.get('password')# 2.验证用户名和密码是否正确# 2.1 去哪个表中查询数据# 2.2 使用这张表中的哪个字段来比较'''这里的登录,我们使用auth模块,登录的时候所使用的表是auth_user表'''# def authenticate(request=None, **credentials):return user 需要关键字传参user_obj = auth.authenticate(request, username=username, password=password)  # request.session['username'] = user_obj.usernane'''返回值是登录成功之后的用户对象'''print(user_obj)  # lindaprint(user_obj.username)  # lindaprint(user_obj.password)  # pbkdf2_sha256$150000$auQyjuifJ0ie$I8uTuxyATU6FubswdMCTiL2+Hg+5sqzkvZruPmPdlZ0='''注意事项1:传递参数的时候,用户名和密码必须同时传入'''# if user_obj:#     # 保存用户的状态:cookie  session#     request.session['username'] = user_obj.username#     request.session['id'] = user_obj.id'''注意事项2:由于上面使用了auth模块,在此不建议这样写,auth模块都提供有相应的方法要么全部使用auth模块的方法,要么全部自己写,不建议混合使用'''# 3.使用auth模块提供的方法auth.login(request, user_obj)'''只要写了auth.login,那么就可以在全局有任何request的地方使用request.user拿到用户对象'''return redirect('/home/')return render(request, 'login.html')

登录页面前端代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>body {{#background: url('https://pic2.zhimg.com/3ae866e7992a94069c7e0c417aac807d_r.jpg') no-repeat;#}background: url('https://img0.baidu.com/it/u=741268616,1401664941&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1691859600&t=5c5bee3052ecec363c1ecc2eea9ac3f7') no-repeat;background-size: 100% 130%;}#login_box {width: 20%;height: 400px;background-color: #00000060;margin: auto;margin-top: 10%;text-align: center;border-radius: 10px;padding: 50px 50px;}h2 {color: #ffffff90;margin-top: 5%;}#input-box {margin-top: 5%;}span {color: #fff;}input {border: 0;width: 60%;font-size: 15px;color: #fff;background: transparent;border-bottom: 2px solid #fff;padding: 5px 10px;outline: none;margin-top: 10px;}button {margin-top: 50px;width: 60%;height: 30px;border-radius: 10px;border: 0;color: #fff;text-align: center;line-height: 30px;font-size: 15px;background-image: linear-gradient(to right, #30cfd0, #330867);}#sign_up {margin-top: 45%;margin-left: 60%;}a {color: #b94648;}</style>
</head><body>
<div id="login_box"><h2>登录页面</h2><form action="" method="post"><div id="input_box"><input type="text" placeholder="请输入用户名" name="username"></div><div class="input_box"><input type="password" placeholder="请输入密码" name="password"></div><button>提交</button>
{#        <input type="submit" value="提交">#}<br></form>
</div>
</body>
</html>

四、Auth模块之退出系统

def logout(request):# 清除cookie或者sessionauth.logout(request)return redirect('/home/')

六、Auth模块之修改密码功能

1.验证老密码是否正确
is_right = request.user.check_password(old_password)2.修改密码
request.user.set_password(new_password) # 这种写法没有真正的操作数据库
request.user.save()  # 但是执行了save()之后就操作数据库了案例代码:
@login_required
def set_password(request):if request.method == 'POST':old_password = request.POST.get('old_password')new_password = request.POST.get('new_password')re_password = request.POST.get('re_password')# 先验证两次密码是否输入一致if new_password == re_password:# 验证老密码是否正确is_right = request.user.check_password(old_password)if is_right:# 修改密码# 方式1:这种写法没有真正的操作数据库request.user.set_password(new_password)# 方式1需要保存一下才能修改成功到数据库request.user.save()return redirect('/home/')return render(request, 'set_password.html', locals())前端代码:
<div id="login_box"><h2>修改密码</h2><form action="" method="post">{% csrf_token %}<div id="input_box">用户名:<input type="text" name="username" readonly value="{{ request.user.username }}"></div><div class="input_box">旧密码:<input type="password" placeholder="请输入旧密码" name="old_password"></div><div class="input_box">新密码:<input type="password" placeholder="请输入新密码" name="new_password"></div><div class="input_box">请确认:<input type="password" placeholder="确认新密码" name="re_password"></div><button>提交</button>
{#        <input type="submit" value="提交">#}<br></form>
</div>

七、Auth模块之注册功能

'''
入库的三种方式:方式1:自动入库到auth_user表,但是密码是明文密码,登录的时候是经过加密处理的,则登录不上User.objects.create(username=username, password=password)方式2:密码是密文入库User.objects.create_user(username=username, password=password)方式3:创建超级用户,并且密码是密文存入,但是必须指定邮箱,否则报错User.objects.create_superuser(username=username, password=password, email='123@qq.com')
'''from django.contrib.auth.models import Userdef register(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')# 入库# 方式1:自动入库到auth_user表,但是密码是明文密码,登录的时候是经过加密处理的,则登录不上# User.objects.create(username=username, password=password)# 方式2:创建普通用户,密码是密文入库# User.objects.create_user(username=username, password=password)# 方式3:创建超级用户,并且密码是密文存入,但是必须指定邮箱,否则报错User.objects.create_superuser(username=username, password=password, email='123@qq.com')return redirect('/login/')return render(request, 'register.html')

八、扩展默认的auth_user表

默认情况下使用的就是auth_user的默认字段
扩展我们自己的字段前提是:所有的模型类都继承
from django.contrib.auth.models import AbstractUser现在是要在auth_user表的基础上扩展字段,不要继承了models.Model**************************************************************************
注意:扩展之后需要在配置文件(settings.py)中加一句话AUTH_USER_MODEL = '应用名.表名'eg:AUTH_USER_MODEL = 'app01.UserInfo'-------------------------------------------------------------------------------------注意:"""在扩展表之前数据库不能够迁移,扩展这个表需要在迁移数据库之前做"""问:如果你迁移了,还想扩展怎么办?1. 换库2. 需要删除很多个应用的migrations文件夹
注意:迁移报错的时候,有可能会用到下面这句代码:python manage.py migrate myapp --fake---------------重点:扩展表之后发生的变化-------------------
"""扩展表之后发生的变化:1. 原来的auth_user表不存在了,换成你自己新建的表名了2. 原来的auth_user表中的字段还都在,然后多了自己扩展的字段3. 继承的类要发生改变AbstractUser4. 在配置文件中加入下面一句话:AUTH_USER_MODEL = 'app01.UserInfo'AUTH_USER_MODEL = '应用名.类名'5. 扩展之后还是按照原来的auth_user表使用6. auth模块中的数据还是你扩展的表7. 扩展之前别迁移.
"""--------------------------------------------------------------------
案例:
因为之前迁移过了,所以我选择换库:从sqlite3---->mysql1.在settings.py配置文件中把数据库换成MySQL:
'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'db22','HOST': '127.0.0.1','PORT': 3306,'USER': 'root','PASSWORD': 'root','CHARSET': 'utf8'},
2.扩展表的字段:先导入AbstractUser,让扩展表继承AbstractUser
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):phone = models.CharField(max_length=64)# 头像avatar = models.CharField(max_length=64)
3.迁移
python manage.py makemigrations
python manage.py migrate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/33108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

制造业企业数字化转型之设备数据采集

导 读 ( 文/ 1894 ) 随着信息技术的快速发展和制造业的转型升级&#xff0c;企业数字化转型已成为保持竞争力和实现可持续发展的关键。在数字化转型过程中&#xff0c;设备数据采集作为重要的一环&#xff0c;发挥着关键的作用。设备数据采集通过收集、分析和利用设备所产生的数…

【资讯速递】AI与人类思维的融合;OpenAI在中国申请注册“GPT-5”商标;移动大模型主要面向to B 智能算力是未来方向

2023年8月11日 星期五 癸卯年六月廿五 第000001号 欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于IT资讯速递专栏,本专栏主要用于发布各种IT资讯&#xff0c;为大家可以省时省力的就能阅读和了解到行业的一些新资讯 资…

Effective Java笔记(28)列表优于数组

数组与泛型相比&#xff0c;有两个重要的不同点 。 首先&#xff0c;数组是协变的&#xff08; covariant &#xff09; 。 这个词听起来有点吓人&#xff0c;其实只是表示如果 Sub 为 Super 的子类型&#xff0c;那么数组类型 Sub[ ]就是Super[ ]的子类型。 相反&#xff0c;泛…

无涯教程-Perl - link函数

描述 此函数创建一个新文件名NEWFILE,链接到文件OLDFILE。该函数创建一个硬链接&#xff1b;如果需要符号链接,请使用符号链接功能。 语法 以下是此函数的简单语法- link OLDFILE,NEWFILE返回值 如果失败,此函数返回0,如果成功,则返回1。 例 以下是显示其基本用法的示例…

开发一个RISC-V上的操作系统(六)—— 中断(interrupt)和异常(exception)

目录 往期文章传送门 一、控制流 &#xff08;Control Flow&#xff09;和 Trap 二、Exceptions, Traps, and Interrupts Contained Trap Requested Trap Invisible Trap Fatal Trap 异常和中断的异同 三、RISC-V的异常处理 mtvec&#xff08;Machine Trap-Vector Ba…

从零学算法154

154.已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,4] 若旋转 7 次&#…

前端必学的CSS3波浪效果演示

以下是这三种CSS3波浪效果的使用说明 使用translateX和translateZ属性创建波浪效果&#xff1a; 使用场景&#xff1a; 适用于需要在X轴上平移和在Z轴上应用3D变换的波浪效果。可以用于创建具有起伏效果的海浪、水面波纹等效果。 优点&#xff1a; 通过3D变换&#xff0c;…

内生安全构建数据存储

一、数据安全成为防护核心&#xff0c;存储安全防护不容有失 1、数据作为企业的核心资产亟需重点保护&#xff0c;数据安全已成网络空间防护核心 2、国家高度重视关键信息基础设施的数据安全&#xff0c;存储安全已成为审核重点 二、存储安全是数据安全的关键一环&#xff0c;应…

AIGC技术揭秘:探索火热背后的原因与案例

文章目录 什么是AIGC技术&#xff1f;为何AIGC技术如此火热&#xff1f;1. 提高效率与创造力的完美结合2. 拓展应用领域&#xff0c;创造商业价值3. 推动技术创新和发展 AIGC技术案例解析1. 艺术创作&#xff1a;生成独特的艺术作品2. 内容创作&#xff1a;实时生成各类内容3. …

SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系

SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系 1 SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系 1 SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系 https://www.swrjzxw.com/1556.html SolidWorks装配体时 显示 不能使用选择如允许此选…

哪些CRM的报价公开且透明?

企业在选型时&#xff0c;会发现很多品牌的CRM系统价格并不透明&#xff0c;往往都是需要跟产品顾问沟通后才能了解。下面推荐一款价格实在的CRM系统&#xff0c;所有报价公开透明&#xff0c;那就是Zoho CRM。 Zoho CRM是什么&#xff1f; Zoho CRM是一款在线CRM软件&#x…

NAS相关

Debian11 更换软件源 备份 #备份软件源列表 cp /etc/apt/sources.list /etc/apt/sources.list.bak编辑sources.list nano /etc/apt/sources.list替换文件内容 deb http://mirrors.163.com/debian/ bullseye main non-free contrib deb http://mirrors.163.com/debian/ bull…

SAP BAPI 创建/修改MD61/MD62计划独立需求预测

MD61 创建&#xff1a; BAPI: BAPI_REQUIREMENTS_CREATE CLEAR: lv_error,ls_requirements_item,lt_requirements_schedule_in,ls_requirements_schedule_in,lt_return_n,ls_return_n,lv_reqmtsplannumber."工厂ls_requirements_item-plant lv_werks."MRP AR…

pytorch模型加载caffe模型的权重

一、将caffe模型的权重转成dict格式 caffe库的编译可以参考我之前写的一篇博客&#xff1a;ImportError: dynamic module does not define module export function (PyInit__caffe)问题解决记录_chen_zn95的博客-CSDN博客 安装好后使用以下脚本便可将caffe模型的参数名和参数…

分布式测试插件 pytest-xdist 使用详解

目录 使用背景&#xff1a; 使用前提&#xff1a; 使用快速入门&#xff1a; 使用小结&#xff1a; 使用背景&#xff1a; 大型测试套件&#xff1a;当你的测试套件非常庞大&#xff0c;包含了大量的测试用例时&#xff0c;pytest-xdist可以通过并行执行来加速整体的测试过…

js中的break和continue中的区别

js中break和continue有着一些差别。 首先&#xff0c;虽然break和continue都有跳出循环的作用&#xff0c;但break是完全跳出循环&#xff0c;而continue则是跳出一次循环&#xff0c;然后开启下一次的循环。 下面我就来举几个例子吧。 var num 0;for(var i 1;i < 10;i){i…

如何使用ChatGPT设计LOGO,只需知道品牌名字就能完成傻瓜式操作

​独特且引人注目的LOGO对于引导用户/消费者快速识别并与你建立联系至关重要。然而&#xff0c;聘请专业的设计师来创建个性化LOGO可能非常昂贵。这里可以使用使用ChatGPT。[1] 你只需要&#xff1a; 准备好公司名称&#xff1b; 能用ChatGPT&#xff0c;用来给BingChat喂log…

学习总结(TAT)

好久都没交总结了&#xff0c;今天把之前的思路和错误整理了一下&#xff1a; 在服务器和客户端两侧&#xff0c;不可以同时先初始化获取输入流&#xff0c;否则会造成堵塞&#xff0c;同时为这位作者大大打call&#xff1a; (3条消息) 关于Java Socket和创建输入输出流的几点…

一、安全世界观

文章目录 1、 Web安全简史1.1 中国黑客简史1.2 黑客技术的发展历程1.3 web安全的兴起 2、黑帽子、白帽子3、安全的本质4、安全三要素5、如何实施安全评估5.1 资产等级划分5.2 威胁分析5.3 风险分析5.4 设计安全方案 6、白帽子兵法6.1 Secure By Default6.2 纵深防御原则6.3 数据…

java的junit之异常测试、参数化测试、超时测试

1.对可能抛出的异常进行测试 异常本身是方法签名的一部分测试错误的输入是否导致特定的异常 summary 测试异常可以使用Test(expectedExceptio.class)对可能发生的每种类型的异常进行测试 2.参数化测试 如果待测试的输入和输出是一组数据&#xff1a; 可以把测试数据组织起…