Django基础篇:csrf装饰器、中间件思想编写项目、auth认证模块、bbs项目分析

2022.5.25 csrf装饰器、中间件思想编写项目、auth认证模块、bbs项目分析

  • csrf相关装饰器
  • 基于中间件思想编写项目
  • auth认证模块
  • bbs项目分析

Xkq2dI.md.jpg

一、csrf相关装饰器

昨天我们学习了csrf在全局作为校验前端标志的工具的使用,那么我们今天学习一个可以让csrf校验失效或者不使用csrf全局校验也可以实现校验的功能;

1、针对FBV

# 首先需要导入一个模块
from django.views.decorators.csrf import csrf_exempt,csrf_protect

# csrf_exempt 忽略csrf校验(全局csrf使用时)
    @csrf_exempt
    def login(request):  # 可以将此视图函数忽略csrf校验
        return render(request,'login.html')
    
# csrf_protect 开启csrf校验(全局csrf关闭时)
    @csrf_protect
    def login(request):  # 可以将此视图函数开启csrf校验
        return render(request,'login.html')

2、针对CBV

# 首先需要导入一个模块
from django.views.decorators.csrf import csrf_exempt,csrf_protect

# @method_decorator(csrf_exempt,name='post')  # 无效
@method_decorator(csrf_protect,name='post')  # 可以
class MyView(views.View):
    # @method_decorator(csrf_protect)  # 可以
    @method_decorator(csrf_exempt)  # 有效
    def dispatch(self, request, *args, **kwargs):
        return super(MyView, self).dispatch(request,*args,**kwargs)

    # @method_decorator(csrf_exempt)  # 无效
    @method_decorator(csrf_protect)  # 可以
    def post(self,request):
        return HttpResponse('from MyView post')
    
'''
结论:
	csrf_protect(开启csrf校验) :三种CBV添加装饰器的方式都可以
	csrf_exempt(忽略csrf校验) :只有一种方式可以生效 >>> 重写dispatch方法加装饰器
'''

二、基于中间件思想编写项目

1、importlib模块

可以通过字符串的形式导入模块

# 常规导入方式
    from ccc import b
    print(b)  # <module 'ccc.b' from '/Users/jiboyuan/PycharmProjects/day61_1/ccc/b.py'>
    print(res.name)

# 字符串导入方式importlib
    import importlib
    module_path = 'ccc.b'
    res = importlib.import_module(module_path)
    print(res.name)

# 区别
	from ccc.b import name  # 可以直接导变量数据;
    importlib.import_module(module_path)  # 不可以,最小导入单位是模块文件级别;

2、中间件思想

通过观察django中的中间件,我们发现,基本上是以列表的形式展示中间件的导入路径,并且储存在列表中的导入方法是字符串方法,其实是使用了importlib模块(可以通过字符串的形式导入模块);

通过这个,我们也可以按照这个思路编写我们自己的代码:

(1)在项目中创建一个包(自带双下init文件),用于存储不同功能的py文件,每个py文件是不同的功能(类方法);

(2)创建一个settings.py文件,把功能方法的导入方式(字符串形式)封装在列表中,并存储在一个settings.py文件内;

(3)在双下init文件中封装一个方法,用于调用包里的所有方法,并获取settings文件中的导入模块的字符串形式,切割字符串后获取文件路径和方法名,然后使用importlib模块调用每个模块,通过反射获取模块中的对应方法名的属性,并获取对象进行实例化;

(3)创建一个start.py,调用包内的双下init封装的方法,用于控制所有的功能模块,如:包.方法名()

XkqXF0.png

3、代码模拟(中间件思想)

需求:模拟不同平台发送给用户消息,例:QQ、微信

# start.py
import notify
if __name__ == '__main__':
    notify.send_all('端午节怎么过???')
    
# settings.py
NOTIFY_FUNC_LIST = [
    'notify.qq.QQ',
    'notify.weixin.WeiXin',
]

# notify包中的__init__.py文件(中间件思想核心逻辑)
import settings
import importlib
def send_all(msg):
    # 1.循环获取配置文件中字符串信息
    for str_path in settings.NOTIFY_FUNC_LIST:  # 'notify.email.Email'
        # 2.切割路径信息
        module_path, class_str_name = str_path.rsplit('.', maxsplit=1)  # ['notify.email','Email']
        # 3.根据module_path导入模块文件
        module = importlib.import_module(module_path)
        # 4.利用反射获取模块文件中对应的类名
        class_name = getattr(module, class_str_name)  # Email  Msg  QQ
        # 5.实例化
        obj = class_name()
        # 6.调用发送消息的功能
        obj.send(msg)
        
# notify包中的qq.py
class QQ(object):
    def __init__(self):
        pass  # 模拟发送qq需要提前准备好的操作

    def send(self,msg):
        print('qq提示:%s'%msg)
        
# notify包中的weixin.py文件
class WeiXin(object):
    def __init__(self):
        pass  # 发送微信提示需要提前准备的操作

    def send(self,msg):
        print('微信提示:%s'%msg)

三、auth认证模块

1、什么是auth认证模块

# django提供给你快速完成用户相关功能的模块
	用户相关功能:创建、认证、编辑...
        
# django也配套提供了一张'用户表'
	执行数据库迁移命令之后默认产生的auth_user;
    
# django自带的admin后台管理用户登录参考的就是auth_user表
	创建admin后台管理员用户:run manage.py task>>:createsuperuser;
  	自动对用户密码进行加密处理并保存;

2、auth模块方法大全

from django.contrib import auth
# 1.验证用户名和密码是否正确
	用户对象 = auth.authenticate(request,username=username,password=password)
    #(1)先对密码做加密处理,然后再比对;
    #(2)校验正确返回的是用户对象,错误返回的是None;
    
# 2.保存用户登录状态
	auth.login(request,用户对象)
    
# 3.获取当前用户对象
	request.user
    # 获取当前登录的用户对象,或者是匿名用户;
    
# 4.判断当前用户是否登录
	request.user.is_authenticated()
    # 判断用户是否登录,返回布尔值;
    
# 5.校验登录装饰器
    from django.contrib.auth.decorators import login_required
    # 用户没有登录,则默认跳转到/accounts/login/,也可以自定义;
    # 1.局部配置
    @login_required(login_url='/lg/')
    # 2.全局配置
    LOGIN_URL = '/lg/'  # 需要在配置文件中添加配置
    @login_required  # 直接加在视图函数前
	
# 6.修改密码
	request.user.check_password(old_password) # 括号内是字符串类型,自动加密再比对
  	request.user.set_password(new_password) # 临时修改密码
  	request.user.save() # 将修改操作同步到数据库中
    
# 7.注销登录
	auth.logout(request)  # 注销用户
    
# 8.注册用户
	from django.contrib.auth.models import User
  	User.objects.create_user(username='oscar',password='123')  # 创建普通用户
  	User.objects.create_superuser(username='admin',password='123',email='123@qq.com')  # 创建管理员,需要加email,否则报错

3、auth扩展表字段

# 方式1:编写一对一表关系(了解)
# 方式2:类继承(推荐)
from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
    # 编写AbstractUser类中没有的字段 不能冲突!!!
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=32)

# settings.py文件中
AUTH_USER_MODEL = 'app01.Users'  # 告诉auth模块 不再使用auth_user 而是使用自定义的表
"""
1.类继承之后 需要重新执行数据库迁移命令 并且库里面是第一次操作才可以
2.auth模块所有的方法都可以直接在自定义模型类上面使用
	自动切换参照表
"""
ps:课下可以先继承表 之后才练习auth所有的方法

四、bbs项目分析

1、项目开发流程

1.需求分析
2.技术选型
3.分组开发
4.提交测试
5.交付上线
"""
我们以后写项目 一般都是从数据库设计开始!!!
	一个好的数据库设计 会让我们写代码变得非常的轻松
"""

2、bbs数据表分析

"""
1.先确定表
2.再确定字段
3.最后确定关系
"""
1.用户表
	继承AbstractUser
2.个人站点表
	站点名称、标题、样式
3.文章表
	标题、简介、内容、发布时间
4.文章分类表
	分类名称
5.文章标签表
	标签名称
6.文章点赞点踩表
	文章、用户、赞/踩
7.文章评论表
	文章、用户、评论内容、评论时间

表关系分析简图:

XAZggg.png

posted @ 2022-05-25 21:22  马氵寿  阅读(102)  评论(0)    收藏  举报