【csrf相关装饰器,基于中间件编写项目,auth模块,bbs项目】

文章目录

      • csrf相关装饰器
        • 针对FBV:
        • 针对CBV:
      • 基于中间件思想编写项目
      • 功能的插拔式设计
      • auth认证模块
      • auth模块方法大全
        • 局部配置
        • 全局配置
        • auth扩展表字段
      • dbs项目

csrf相关装饰器

控制csrf针对局部校验

我们使用csrf相关装饰器需要使用两个方法

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

csrf_exempt:忽略csrf校验 需要开启全局csrf

csrf_protect:开启csrf校验 需要关闭全局csrf

针对FBV:

@csrf_protect/@csrf_exempt
def login(request):
return render(request,‘login.html’)

针对CBV:

针对csrf_protect方法,CBV添加装饰器的三种方式都可以

from django.utils.decorators import method_decorator

@method_decorator(csrf_protect,name='post')  # 可以
class MyView(views.View):
    @method_decorator(csrf_protect)  # 可以
    def login(request):
        return HttpResopnse('123')
    @method_decorator(csrf_exempt)  # 有效
    def dispatch(self, request, *args, **kwargs):
        return super(MyView, self).dispatch(request,*args,**kwargs) 
针对csrf_exempt,CBV只有重写dispatch方式才有效

class MyView(views.View):
    @method_decorator(csrf_exempt)  # 有效
    def dispatch(self, request, *args, **kwargs):
        return super(MyView, self).dispatch(request,*args,**kwargs)

基于中间件思想编写项目

importlib模块(配置信息使用)

将模块按字符串的形式导入

import importlib
module_path = 'ccc.b'
res = importlib.import_module(module_path)
print(res)  # 
print(res.name)  # from ccc.b jason

常规导入方式

from 模块介绍.ccc import b
print(b) #
print(b.name) # from ccc.b jason

常规导入方式可以直接导入模块中的具体变量数据

而importlib模块只能最小导入单位为模块级别

功能的插拔式设计

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

方式1:封装成函数

notify.py文件里面写了各个功能,然后使用一个方法统一调用这些功能

def send_email(msg):
    print('邮箱信息提示:%s' % msg)

def send_msg(msg):
    print('短信信息提示:%s' % msg)

def send_qq(msg):
    print('qq信息提示:%s' % msg)

def send_all(msg):
    send_email(msg)
    send_msg(msg)
    send_qq(msg)

start.py启动文件中导入模块,使用启动方法,如果我们想取消某个功能,我们可以取功能模块中注释掉函数

import notify

if __name__ == '__main__':
    notify.send_all('端午节怎么过???')

我们需要进入到核心文件中更改代码

方式2:封装成配置

创建文件夹存放功能,里面编写功能模块

我们将方法名按照面向对象的多态性设置成相同的名称

class Email(object):
    def __init__(self):
        pass  # 模拟发送邮件需要提前准备好的操作
    
    def send(self,msg):
        print('邮箱提醒:%s'%msg)

然后在settings.py配置文件中将功能模块文件按字符串形式存放

NOTIFY_FUNC_LIST = [
    'notify.email.Email',
    'notify.msg.Msg',
    'notify.qq.QQ',
    'notify.weixin.WeiXin',
]

我们在start.py启动文件中导入功能包,使用里面的功能模块,我们需要编写__init__.py文件

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)

最后在start.py文件中使用

import notify

if __name__ == '__main__':
    notify.send_all('端午节怎么过')

auth认证模块

auth认证模块简介
Auth模块是Django自带的用户认证模块

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,Django作为一个完美主义者的终极框架,它内置了强大的用户认证系统–auth。

django也配套提供了一张’用户表’

执行数据库迁移命令之后默认产生的auth_user

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

创建admin后台管理员用户:run manage.py task>>:createsuperuser

自动对用户密码进行加密处理并保存

auth模块方法大全

auth表

from django.contrib.auth.models import AbstractUser
auth.authenticate():验证用户名和密码是否正确

is_user_obj = auth.authenticate(request,username=username,password=password)  # 先对密码做加密处理 然后再比对
print(is_user_obj)  # 校验正确返回的是用户对象 错误返回的是None
auth.login():保存用户登录状态

auth.login(request,is_user_obj)  # 自动帮你操作session相关
request.user:获取当前用户对象

print(request.user)  # 获取当前登录的用户对象 或者是 匿名用户
request.user.is_authenticated():判断当前用户是否登录

print(request.user.is_authenticated())  # 判断用户是否登录 返回布尔值
@login_required:校验登录装饰器

局部配置

from django.contrib.auth.decorators import login_required

用户没有登录 默认跳转到/accounts/login/ 也可以自定义

@login_required(login_url=‘/lg/’) # 局部配置
def index(request):
return HttpResponse(“index页面 只有登录的用户才可以查看”)

全局配置

from django.contrib.auth.decorators import login_required
@login_required  # 采用全局配置
def index(request):
    return HttpResponse("index页面 只有登录的用户才可以查看")
settings.py配置文件中添加配置

LOGIN_URL = '/lg/'
request.user.check_password():校验密码是否正确

is_right = request.user.check_password(old_password)  # 自动加密再比对  返回布尔值
request.user.set_password():修改密码

request.user.set_password(new_password)  # 临时修改密码
request.user.save():保存数据

request.user.save()  # 将修改操作同步到数据库中
auth.logout(request):注销登录

注册用户

User.objects.create_user(username=‘oscar’,password=‘123’) # 创建普通用户
User.objects.create_superuser(username=‘admin’,password=‘123’,email=‘[email protected]’) # 创建超级管理员

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模块所有的方法都可以直接在自定义模型类上面使用,自动切换参照表

dbs项目

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

我们以后写项目 一般都是从数据库设计开始

一个好的数据库设计 会让我们写代码变得非常的轻松

bbs数据表分析
1.先确定表
2.再确定字段
3.最后确定关系

1.用户表
继承AbstractUser
2.个人站点表
站点名称、标题、样式
3.文章表
标题、简介、内容、发布时间
4.文章分类表
分类名称
5.文章标签表
标签名称
6.文章点赞点踩表
文章、用户、赞/踩
7.文章评论表
文章、用户、评论内容、评论时间

你可能感兴趣的:(django,中间件,csrf,python)