昨日内容回顾
-
django中间件三个需要了解的方法
process_view 路由匹配成功之后执行视图函数\类之前自动触发 process_exceptoon 视图函数\类执行报错之后自动触发 process_template_response 返回的HttpResponse对象含有render属性并且对应一个方法是自动触发
-
基于django中间件实现功能插拔式设计
1.importlib 通过字符串导入模块 2.从右开始切割字符串 rsplit 3.反射 将模块名看成是对象通过反射获取该模块中某个字符串对应的名字 4.面向对象的多态性
-
cookie与session简介
cookie 保存在客户端与用户状态相关的数据 session 保存在服务端与用户状态相关的数据 ps:以后我们还会接触到token、jwt等各种技术 目的都只有一个>>>:记录某种状态
-
django操作cookie
HttpResponse对象.set_cookie(key,value) # 添加cookie信息到对象,再返回对象到前端,浏览器就会帮我们保存这样的KV键值对,每次浏览器向后端发送请求数据的时候,都会把cookie的数据,放在请求头里面!!!注意 HttpResponse对象.COOKIES.get(key) HttpResponse对象.set_signed_cookie(key, value, salt='加密盐', # 给value的数据加盐 max_age=None, # 失效时间 expires=None # 失效时间 针对IE浏览器的 ... ) HttpResponse对象.delete_cookie(key) # 删除cookie 用户的注销登录会用到!!! ''' 所谓退出登录本质其实就是:将客户端的标识用户身份的cookie删除!!! '''
-
django操作session
1.默认必须要有django_session表 !!! 2.django默认的session失效时间14天 !!! request.session[key] = value # 设置session 1.针对key生成一个加密之后的字符串 2.在django_session表中存储加密字符串与加密value数据的记录 3.并且将该加密字符串返回给客户端保存 request.session.get(key) # 获取session 1.自动获取客户端携带的加密字符串 2.自动去django_session表比对是否有对应记录 3.如果有自动获取加密的数据并解密到request.session中 补充知识 # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查会话session的key在数据库中是否存在 request.session.exists("session_key")
# 删除当前会话的所有Session数据
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(t)
* 如果t是个整数,session会在多少秒数后失效。
* 如果t是个datatime日期对象或timedelta时间间隔,session就会在这个时间后失效。
* 如果t是0,用户关闭浏览器session就会失效。
* 如果t是None,session会依赖全局session失效策略。
> # 今日内容概要
* csrf跨站请求伪造
* csrf相关校验策略
* CBV添加装饰器的多种方式
* auth认证模块
* BBS项目需求分析
> # 今日内容详细
### csrf跨站请求伪造
```python
钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻
eg:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户 并不是真正的四六级官方账户
模拟钓鱼网站案例:转账案例
内部隐藏标签
思考:如何区分真假网站页面发送的请求
csrf校验策略
在提交数据的位置添加唯一标识
1.form表单csrf策略
form表单内部添加 {% csrf_token %}
2.ajax请求csrf策略
// 方式1:自己动手取值 较为繁琐
{#data:{'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},#}
// 方式2:利用模板语法自动获取(一定要用引号引起来)
{#data:{ 'csrfmiddlewaretoken':'{{ csrf_token }}','username':'jason'},#}
// 方式3:直接引入一个js脚本即可(官网提供的)
参考: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_exempt
@csrf_protect
def transfer_func(request):pass
CBV添加装饰器的方式(与正常情况不一样 需要注意)
主要有三种方式
# @method_decorator(csrf_protect, name='post') # 方式2:单独生效
class MyView(views.View):
@method_decorator(csrf_protect) # 方式3:整个类中生效
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
# @method_decorator(csrf_protect) # 方式1:单独生效
def post(self, request):
return HttpResponse('from cbv post view')
注意有一个装饰器是特例只能有一种添加方式>>>:csrf_exempt
只有在dispatch方法添加才会生效
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.用户注册功能
User.objects.create_user(username=username, password=password)
2.判断用户名和密码是否正确
user_obj = auth.authenticate(request,
username=username,
password=password)
3.判断用户是否登录
request.user.is_authenticated
4.获取登录用户对象数据
request.user
5.校验用户是否登录装饰器
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/') 局部配置
@login_required 全局配置
配置文件中LOGIN_URL = '/login/'
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):
# 填写AbstractUser表中没有的字段
phone = models.BigIntegerField()
desc = models.TextField()
步骤2:一定要在配置文件中声明替换关系
AUTH_USER_MODEL = 'app01.UserInfo'
ps:替换还有一个前提 就是数据库迁移没有执行过(auth相关表没有创建)
作业
1.利用auth模块编写一个网站导航条相关的功能(用自己创建的表)
也可以直接在图书管理系统中切入用户相关的功能
导航条右侧 用户没有登录现实 登录 和 注册
用户登录之后 现实当前用户名及登录之后的一些操作 修改密码 退出登录
2.整理今日内容及博客
3.复习本周内容
标签:跨站,request,auth,django,session,user,csrf,BBS
From: https://www.cnblogs.com/tengyifan888/p/17004497.html