zoukankan      html  css  js  c++  java
  • 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'
    
  • 相关阅读:
    Matlab之快速傅里叶变换
    关于Debug和Release的区别 (VS C#)
    QSqlQuery::value: not positioned on a valid record
    UML系列图--用例图
    SQLite 数据类型总结
    c++构造函数
    求Fibonacci数列通项公式
    ObjectMapper类
    命令行运行jar 提示找不到主程序解决方案
    httpclient框架实现接口自动化的思路(二)
  • 原文地址:https://www.cnblogs.com/yushan1/p/11773929.html
Copyright © 2011-2022 走看看