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'
原文地址:https://www.cnblogs.com/yushan1/p/11773929.html