csrf相关装饰器 基于中间件思想编写项目 auth认证模块 auth扩展表字段 bbs项目数据表分析
day 61
如何将模块用字符串的形式导入?
需要用到 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中 导入settings
、importlib
模块 封装一个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('请注意! 没有假期!! 没有假期!!!')
效果如下:
以上方法的好处是 将来如果想要把某一个功能去掉 只需要在配置文件中将对应的功能注释掉
# django提供给你快速完成用户相关功能的模块
用户相关功能:创建、认证、编辑... 其实就是登录注册
# django也配套提供了一张'用户表'
执行数据库迁移命令之后默认产生的auth_user
# django自带的admin后台管理用户登录参考的就是auth_user表
创建admin后台管理员用户:
run manage.py task>>:createsuperuser
自动对用户密码进行加密处理并保存
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('注册功能')
# 方式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.交付上线
"""
我们以后写项目 一般都是从数据库设计开始!!!
一个好的数据库设计 会让我们写代码变得非常的轻松
"""
"""
1.先确定表
2.再确定字段
3.最后确定关系
"""
1.用户表
继承AbstractUser
2.个人站点表
站点名称、标题、样式
3.文章表
标题、简介、内容、发布时间
4.文章分类表
分类名称
5.文章标签表
标签名称
6.文章点赞点踩表
文章、用户、赞/踩
7.文章评论表
文章、用户、评论内容、评论时间
ps:提前思考表关系
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人