ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

csrf相关装饰器 基于中间件思想编写项目 auth认证模块 auth扩展表字段 bbs项目数据表分析

2022-05-30 00:31:50  阅读:142  来源: 互联网

标签:request 中间件 auth 数据表 user 模块 login password


day 61

 

csrf相关装饰器

如何让某一个视图函数跨过校验规格 不要去做校验?让其不报403错误

我们需要用到下列模块

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

 

# 针对FBV


csrf_exempt  # 忽略csrf校验 在你开启全局的csrf时 运行视图函数会报 Forbidden(403)错误


csrf_protect  # 开启csrf校验 在你关闭全局的csrf时,又想让某一个视图函数校验一下时,就可以给函数装上这个装饰器

使用方式 直接给视图函数装上即可 如下:




# 针对CBV

csrf_protect  三种CBV添加装饰器的方式都可以
csrf_exempt  只有一种方式可以生效(给重写的dispatch方法装)

 

基于中间件思想编写项目

如何将模块用字符串的形式导入?

需要用到 importlib模块

 

 # 常规导入方式

from ccc import b
print(b)  # <module 'ccc.b' from '/Users/jiboyuan/PycharmProjects/day61_1/ccc/b.py'>

 

# 字符串导入方式

import importlib

module_path = 'ccc.b'  # 不能是随意的一个字符串 必须是一个模块所对应的字符串路径形式
res = importlib.import_module(module_path)  # <module 'ccc.b' from '/Users/jiboyuan/PycharmProjects/day61_1/ccc/b.py'>
print(res.name) # 这个res可以看作是模块的名字 可以通过这个res点出模块下所有的数据

importlib模块导入的最小层级单位:py文件

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

 

 

参考diango中间件的思想模仿 将项目中写的功能封装成配置文件形式

需求:以发送提示信息为需求 编写功能

方式1:普通功能整合

  封装成函数 然后通过注释功能函数来控制功能代码执行

操作步骤:

  先开设一个py文件 notify.py  写入功能函数

  再写一个启动文件 start.py 导入notify文件内的send all 函数 就能在使用send all功能

 

方式2:

  封装成配置

操作步骤:

  先建一个包(文件) notify 根据功能的不同 创建不同的py文件 每个文件内写上相应的类

  我们是要将它做成配置文件的形式 那么需要创建一个 settings.py  模拟中间件的样式

  创建一个启动脚本 start.py 导入notify包中的send all  在notify中应该有个双下init文件 

  在双下init中 导入settingsimportlib模块 封装一个send_all方法 如下

def send_all(msg):
    # 1.循环获取配置文件中字符串信息
    for str_path in settings.NOTIFY_FUNC_LIST:
        # 2.切割路径信息
        module_path, class_str_name = str_path.rsplit('.', maxsplit=1)  # ['notify.email','Email']
        # 3.根据module_path导入模块文件
        module = importlib.import_module(module_path)  # 一个个py文件(模块名)
        # 4.利用反射获取模块文件中对应的类名  反射:通过字符串的形式获取属性或者方法
        class_name = getattr(module, class_str_name)  # 获取到真正的类名 Email Msg QQ
        # 5.类实例化产生对象
        obj = class_name()
        # 6.调用发送信息的功能
        obj.send(msg)

  在start.py 

import notify

if __name__ == '__main__':
    notify.send_all('请注意! 没有假期!! 没有假期!!!')

效果如下:

以上方法的好处是  将来如果想要把某一个功能去掉 只需要在配置文件中将对应的功能注释掉

 

auth认证模块

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

 

 

auth模块方法大全

from django.contrib import auth  # 操作auth模块时需要先导入


# 1.验证用户名和密码是否正确
    auth.authenticate()  # 校验正确返回的事用户对象 错误的话返回的事None 

# 2.保存用户登录状态
    auth.login()


# 3.获取当前用户对象
    request.user


# 4.判断当前用户是否登录
    request.user.is_authenticated()


# 5.校验登录装饰器(校验用户是否登录)

先导模块
    from django.contrib.auth.decorators import login_required


    @login_required(login_url='/lg/')  # 局部配置

 # 全局配置需要在配置文件中添加固定路由

LOGIN_URL = '/lg/'
    @login_required  # 全局配置
    


# 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()  # 注册管理员
  User.objects.create_suser()  # 注册普通用户

参考下面代码结合使用:

from django.contrib import auth

def lg(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        '''既然选择使用auth模块  那么就用它的全套功能'''
        # 用户认证功能
        is_user_obj = auth.authenticate(request,username=username,password=password)  # 先对密码做加密处理 然后再比对
        # print(res)  # 校验正确返回的是用户对象不是用户名 错误返回的是None
        if is_user_obj:
            # 记录(保存)用户登录状态
            auth.login(request,is_user_obj)  # 自动帮你操作session表
            return HttpResponse('登录成功')
    return render(request,'lg.html')


def get_user(request):
    print(request.user)  # 获取当前登录的用户对象 或者是 匿名用户
    print(request.user.is_authenticated())  # 判断用户是否登录 返回布尔值
    if request.user.is_authenticated():
        print(request.user.username)
        print(request.user.password)
        print(request.user.last_login)
    return HttpResponse('查看当前用户是否已登录')

from django.contrib.auth.decorators import login_required  # 登录要求装饰器 导入这个模块连校验用户是否登录的装饰器都不用写了
# @login_required  # 用户没有登录 默认跳转到/accounts/login/  也可以自定义 如下
# @login_required(login_url='/lg/')  # 局部配置
"""
如果想要使用全配置 就到settings配置中 写一个固定的路由 如下
LOGIN_UEL = '/lg/' 
"""
@login_required  # 采用全局配置
def index(request):
    return HttpResponse("index页面 只有登录的用户才可以查看")
@login_required
def home(request):
    return HttpResponse("home页面 只有登录的用户才可以查看")
@login_required
def func(request):
    return HttpResponse("func页面 只有登录的用户才可以查看")


@login_required
def set_pwd(request):  # 修改密码功能
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        # 1.先比对原密码是否正确
        is_right = request.user.check_password(old_password)  # 自动加密再比对
        if is_right:
            # 2.修改密码
            request.user.set_password(new_password)  # 临时修改密码 
            # 3.保存数据
            request.user.save()  # 将修改操作同步到数据库中
    return render(request,'set_pwd.html',locals())

@login_required
def logout(request): # 注销功能
    auth.logout(request)
    return HttpResponse('注销')

from django.contrib.auth.models import User  # 导入注册功能模块

def register(request):
    # User.objects.create(username='tony',password='123')  # 不能使用create
    # User.objects.create_user(username='oscar',password='123')  # 创建普通用户
    User.objects.create_superuser(username='admin',password='123',email='123@qq.com')  # 创建超级管理员
    return HttpResponse('注册功能')

 

auth扩展表字段

# 方式1:编写一对一表关系(了解)
# 方式2:类继承(推荐)
from django.contrib.auth.models import AbstractUser  
class Users(AbstractUser):
    # 编写AbstractUser类中没有的字段 不能冲突!!!
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=32)
    
# 告诉auth模块 不再使用auth_user 而是使用自定义的表 加上一下这句
AUTH_USER_MODEL = 'app01.Users'
"""
需要注意的点:
1.类继承之后 需要重新执行数据库迁移命令 并且库里面是第一次操作迁移命令才可以 重复执行数据库迁移命令会报错
2.auth模块所有的方法都可以直接在自定义模型类上面使用
	自动切换参照表
"""
ps:可以先继承表 之后才练习auth所有的方法

 

项目开发流程

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

 

bbs项目数据表分析

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

 

标签:request,中间件,auth,数据表,user,模块,login,password
来源: https://www.cnblogs.com/jiqiong/p/16325427.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有