auth模块
1. auth模块
Auth模块是Django自带的用户认证模块,它默认使用 auth_user 表来存储用户数据
温馨提示 当你需要写用户相关的功能的时候可以考虑使用auth模块
# 校验用户是否存在
user_obj = auth.authenticate(username=username,password=password) # 返回的是数据对象 没有返回None
保存用户登录状态
auth.login(request,user_obj) # 执行完这一句之后 只要是能够拿到request的地方,都可以通过request.user获取到当前登录用户对象
# 判断当前用户是否登录
request.user.is_authenticated()
# 获取当前用户数据对象
request.user
# 如何给视图函数加上校验用户是否登录的校验
# 当用户没有登录的情况下 跳转的url有两种配置方式
from django.contrib.auth.decorators import login_required
# 1.局部配置: 在装饰器括号内通过login_url参数局部指定
@login_required(login_url='/xxx/')
# 2.全局配置: 用户没有登录的情况下 所有的视图统一跳转到一个url
#在配置文件中:
LOGIN_URL = '/login/'
@login_required
1.1 登录功能
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user_obj = auth.authenticate(username=username,password=password)
"""
该方法会有一个返回值 当条件存在的情况下 返回就是数据对象本身
条件不满足 直接返回None
"""
if user_obj:
# 一定要记录用户状态 才算真正的用户登录
auth.login(request,user_obj)
"""该方法会主动帮你操作session表 并且只要执行了该方法
你就可以在任何位置通过request.user获取到当前登录的用户对象
"""
old_path = request.GET.get('next')
if old_path:
return redirect(old_path)
else:
return redirect('/home/')
return render(request,'login.html')
from django.contrib.auth.decorators import login_required
@login_required
def home(request):
return HttpResponse('home页面')
1.2 修改密码
'''
校验原密码是否正确
is_right = request.user.check_password(old_password)
设置新密码
request.user.set_password(new_password)
request.user.save()
'''
from django.contrib.auth.decorators import login_required
@login_required
def set_password(request):
if request.method == 'POST':
old_password = request.POST.get('old_password')
new_password = request.POST.get('new_password')
# 校验原密码对不对
is_right = request.user.check_password(old_password)
# print(is_right)
if is_right:
# 修改密码
request.user.set_password(new_password) # 仅仅只会在内存中产生一个缓存 并不会直接修改数据库
request.user.save() # 一定要点save方法保存 才能真正的操作数据库
return redirect('/login/')
return render(request,'set_password.html',locals())
1.3 用户注册
def register(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# User.objects.create(username=username,password=password) # 使用create 密码会直接存成明文
# User.objects.create_user(username=username,password=password) # 创建普通用户
User.objects.create_superuser(username=username, password=password, email='123@qq.com') # 创建超级用户 邮箱字段必须填写
return render(request, 'register.html')
1.4 扩展auth_user表的字段
# 第一种(不好用)
# 利用一对一表关系 扩展字段
# 第二种(继承)
# 1.自己写一个类 继承原来的auth_user类 然后在settings配置文件中 告诉django使用你新建的类来替代auth_user表
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class Userinfo(AbstractUser):
"""
强调 你继承了AbstractUser之后 你自定义的表中 字段不能跟原有的冲突
"""
phone = models.BigIntegerField()
avatar = models.FileField()
register_time = models.DateField(auto_now_add=True)
# 2.去settings配置文件中指定
AUTH_USER_MODEL = 'app01.Userinfo'
# 固定语法: AUTH_USER_MODEL = '应用名.表名'
"""
通过上面的方式 继承的表 还可以继续使用auth模块所有的功能
"""
2. 参看django中间件配置实现功能的插拔式设计
# 1.新建一个notice文件夹,里面新建一个__init__.py文件和任意名称的其他py文件
# eg:
class Msg:
def __init__(self):
pass # 发信息需要的前提准备工作
def send(self, content):
print(f'信息:{content}')
class Email:
def __init__(self):
pass # 发邮件需要的前提准备工作
def send(self,content):
print(f'邮件:{content}')
# __init__.py
import settings
import importlib
def send_all(content):
for module_path in settings.send_list:
module,class_name = module_path.rsplit('.',maxsplit=1)
# module = notice.email class_name = Email
mod = importlib.import_module(module) # mod就是模块名
# from notice import email
cls = getattr(mod,class_name) # 利用反射获取到模块中类的变量名
obj = cls()
obj.send(content)
# 2.在主文件夹下新建一个run.py文件和settings.py文件
# run.py
import notice
notice.send_all('hahahaha')
# settings.py(存放配置文件)
send_list = [
# 'notice.email.Email',
'notice.msg.Msg',
'notice.wechat.WeChat',
'notice.qq.QQ',
]
3. BBS表设计
项目开发的流程:
1.需求分析
2.项目设计
3.分组开发
4.测试
自己写测试脚本
测试部分专门测试
5.交付上线
表:
用户表:
用户表和个人站点表是一对一的关系
个人站点表
文章标签表:
标签与个人站点一对多
文章分类表:
分类与个人站点是一对多
文章表:
文章和个人站点 是一对多
文章与标签是多对多的关系
文章与分类是一对多
点赞点踩表:
用来存哪个用户给哪篇文章点了赞还是点了踩
user 一对多用户表
article 一对多文章表
is_up 普通字段
本质: 一张表中的一条数据能否对应另外一张表的多条数据
另外一张表的一条数据能够对应当前的表多条件
评论表:
记录哪个用户给哪篇文章评论了哪些内容
user 一对多用户
article 一对多文章
content
parent 一对多评论表 自关联
to='Comment'
to='self'