Django---csrf装饰器,中间件思想编程,auth认证模块和bbs数据表分析

csrf相关装饰器


from django.views.decorators.csrf import csrf_exempt,csrf_protect

csrf_exempt :忽略csrf校验

csrf_protect:开启csrf校验

针对FBV

@csrf_protect\@csrf_exempt
def login(request):
    return render(request,'login.html')

针对CBV

csrf_protect:三种CBV添加装饰器的方式都可以
csrf_exempt:只有一种方式可以生效(给重写的dispatch方法装)
# @method_decorator(csrf_protect,name='post')  # 可以
# @method_decorator(csrf_exempt,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_protect)  # 可以
    # @method_decorator(csrf_exempt)  # 无效
    def post(self,request):
        return HttpResponse('from MyView post')

基于中间件思想编写项目


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

常规导入方式

from ccc import b
from ccc.b import name  # 可以直接导变量数据
print(b)  # <module 'ccc.b' from '/Users/jiboyuan/PycharmProjects/day61_1/ccc/b.py'>
print(b.name)

字符串导入方式

import importlib
module_path = 'ccc.b'
res = importlib.import_module(module_path)
print(res.name)
module_path1 = 'ccc.b.name'
importlib.import_module(module_path1)  # 不可以 最小导入单位是模块文件级别

以发送提示信息为需求编写功能的案例

方式1:封装成函数

方式2:封装成配置:

# settings
NOTIFY_FUNC_LIST = [
    'notify.email.Email',
    'notify.msg.Msg',
    'notify.qq.QQ',
    'notify.weixin.WeiXin',
]
# __init__
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)

auth认证模块


我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。

Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。

django自带的admin后台管理用户登录参考的就是auth_user表。

创建admin后台管理员用户
tools---run manage.py task---执行createsuperuser
自动对用户密码进行加密处理并保存

auth模块方法大全

1.验证用户名和密码是否正确

auth.authenticate() # 校验正确返回的是用户对象 错误返回的是None

2.保存用户登录状态

auth.login() # 自动帮你操作session相关

3.获取当前用户对象

request.user # 获取当前登录的用户对象 或者是 匿名用户

4.判断当前用户是否登录

request.user.is_authenticated()  # 判断用户是否登录 返回布尔值

5.校验登录装饰器

from django.contrib.auth.decorators import login_required
@login_required(login_url='/lg/')  # 局部配置
@login_required  # 全局配置
LOGIN_URL = '/lg/'  # 需要在配置文件中添加配置

6.修改密码

request.user.check_password() # 自动加密再比对
request.user.set_password()  # 临时修改密码
request.user.save()  # 将修改操作同步到数据库中

7.注销登录

auth.logout(request)

8.注册用户

from django.contrib.auth.models import User
User.objects.create_superuser(username='admin',password='123',email='123@qq.com')  # 管理员
User.objects.create_user(username='oscar',password='123')  # 普通用户

auth扩展表字段


方式1:编写一对一表关系(了解)

方式2:类继承(推荐)

# settings
'''告诉auth模块 不再使用auth_user 而是使用自定义的表'''
AUTH_USER_MODEL = 'app01.Users'

# models
from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
    # 编写AbstractUser类中没有的字段 不能冲突!!!
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=32)

注意:

  1. 类继承之后,需要重新执行数据库迁移命令,并且库里面是第一次操作才可以
  2. auth模块所有的方法都可以直接在自定义模型类上面使用,自动切换参照表

项目开发流程和bbs数据表分析


开发流程

1.需求分析
2.技术选型
3.分组开发
4.提交测试
5.交付上线

我们以后写项目,一般都是从数据库设计开始!!!一个好的数据库设计 会让我们写代码变得非常的轻松。

bbs数据表分析

步骤:

  1. 先确定表
  2. 再确定字段
  3. 最后确定关系
表名 字段名
用户表 继承AbstractUser
个人站点表 站点名称、标题、样式
文章表 标题、简介、内容、发布时间
文章分类表 分类名称
文章标签表 标签名称
文章点赞点踩表 文章、用户、赞/踩
文章评论表 文章、用户、评论内容、评论时间
posted @ 2022-05-25 21:31  早安_1207  阅读(80)  评论(0)    收藏  举报
返回顶端