Django框架9
1.django请求生命周期流程图
2.django中间件
它是django的门户
只要是全局相关的功能,都应该考虑是用django中间件来帮你完成
全局用户身份校验
全局用户访问频率校验
用户访问的黑名单
用户访问的白名单
django默认的七个中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
django支持用户自定义中间件
class SessionMiddleware(MiddleWareMixin):
def process_request(self, request):
def process_response(self, request, response):
class CsrfViewMiddleware(MiddlewareMixin):
def process_request(self, request):
def process_view(self, request, callback, callback_args, callback_kwags):
def process_respose(self, request, response):
class AuthentiactionMiddleware(MiddlewareMixin):
def process_request(self, request):
django运行用户自定义中间件并暴露给用户五个可以自定义的方法
掌握:
process_request:
请求来的时候会按照配置文件中注册的中间件从上往下的顺序依次执行每一个中间件里面的process_request方法,如果没有直接跳过执行下一个
同级别返回 并不会全部执行process_response
process_response:
响应走的时候会按照配置文件中注册的中间件从下往上的顺序依次执行每一个中间件里面的process_response方法,该方法必须要有两个形参,并且需要给形参response返回,如果你内部自己返回了HttPResponse对象,会将返回给用户浏览器的内容替换成你自己的
了解:
process_view
路由匹配成功执行视图函数之前触发
process_template_response
视图函数返回的对象中必须要有render属性对应的render方法
def index(request):
def render():
return HttpResponse('你好啊')
obj = HttpResopnse("index")
obj.render = render
return obj
process_exception
当视图函数报错的时候自动触发
3.csrf跨站请求伪造
钓鱼网站
本质搭建一个跟正常网站一模一样的页面,用户在该页面上完成转账功能,转账的请求确实也是朝着正常网站的服务端提交,唯一不同在于收款账户人不同
form表单如何通过crsf校验
你只需要在你的form表单内写一个
{% csrf_token %}
ajax如何通过csrf校验
第一种方式 自己手动获取
data:{'username':'jason', 'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()}
第二种方式 利用模板语法
data:{'username':'jason','crsfmiddlewaretoken':'{{ csrf_token }}'}
第三种 通用方式 引入外部js文件 官网提供的方式
<% load static %>
<script src="{% static 'myset.js' %}"></script>
data: {'username': 'jason'}
csrf相关装饰器
当我们网站整体都校验csrf的时候,让某几个视图函数不校验
当我们网站整体都不校验crsf的时候, 让某几个视图函数校验
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.views import View9
from django.utils.decorators import method_decorator
# @method_decorator(csrf_protect,name='post') # 第二种指名道姓的给类中某个方法装
# @method_decorator(csrf_exempt,name='post') # csrf_exempt 第二种方式不行
@method_decorator(csrf_exempt,name='dispatch') # 可以!!!
class MyHome(View): # APIView
# @method_decorator(csrf_protect) # 第三种 类中所有的方法都装
# @method_decorator(csrf_exempt) # csrf_exempt 第三种方式可以
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request,*args,**kwargs)
def get(self,request):
return HttpResponse('get')
# @method_decorator(csrf_protect) # 第一种方式
# @method_decorator(csrf_exempt) # csrf_exempt 第一种方式不行
def post(self,request):
return HttpResponse('post')
给cbv加装饰器 推荐使用模板method_decorator
我们自己写的装饰器和csrf_protect用法一致
唯独csrf_exempt是一个特例 只能给dispatch方法装
4.auth认证模块
django用户相关的自带的功能模块 auth_user表
如何创建超级用户:
createsupperuser
模块导入
from django.contrib mport auth
from django.contrib.auth.models import User
auth方法大全
1.创建用户
User.objects.create() # 密码都是明文
User.objects.createuser() # 创建普通用户
User.objects.createsuperuser() # 创建超级用户,邮箱要给数据
2.校验用户名和密码是否正确
auth.authenticate(username=username,password=password) #密码和用户名两个一个都不能少
# 该方法当用户名和密码正确的时候返回用户对象 不正确返回none
3.保存用户登录状态
auth.login(request, user_obj)
# 这句执行完以后 request.user获取当前登录的用户对象
4.如何判断当前用户是否登录 以及如何获取当前登录用户对象
request.user.is_authenticcated() # 判断是否登录
request.user # 登录用户对象
5.校验用户是否登录
form django.contrib.auth.deorators import login_required
# 局部配置
@login_required(login_url='/login/')
def xxx(request):
return HttpResponse('xxx页面')
# 全局配置
配置文件中写以下代码
LOGIN_URL = '/login/'
@login_required
def xxx(request):
return HttpResponse('xxx页面')
如果两个都设置了,那么优先执行局部配置
6.修改密码
request.user.check_password(old_password) # 校验原密码是否正确
request.User.set_password(new_pssword)
request.user.save() # 一定要保存
7.注销功能
auth.logout(request)
如何扩展auth_user表
1.利用一对一表关系
2.利用类的继承
# 1 类的继承
from django.contrib.auth.models import User,AbstractUser
# Create your models here.
class Userinfo(AbstractUser):
phone = models.BigIntegerField()
avatar = models.FileField()
# 扩展的字段 尽量不要与原先表中的字段冲突
# 2 配置文件
AUTH_USER_MODEL = '应用名.表名'
"""
django就会将userinfo表来替换auth_user表
并且之前auth模块所有的功能不变 参照的也是userinfo表
"""
5.BBS表设计
用户表
继承auth_user表
phone
avatar
register_time
个人站点表
站点名称
站点标题
站点样式
文章分类表
分类名
文章标签表
标签名
文章表
文章标题
文章摘要
文章详情
创建日期
点赞点踩表
user 一对多用户
article 一对多文章
is_up 布尔值字段
文章评论表
user 一对多用户
article 一对多文章
content 普通字段
create_time 评论日期
parent ForeginKey(to='文章评论表')
parent ForeginKey(to='self')
根评论子评论