zoukankan      html  css  js  c++  java
  • auth模块 + 插拔式思想

    auth模块 + 插拔式思想

    一、auth模块

    ​ django为方便实现用户功能,包括登陆注册注销修改信息等,提供了auth模块,实现操作简单化。

    1.1 常用方法

    ​ 超级用户:

    # run manage.py Task:
    createsuperuser
    

    ​ authenticate():用户认证,认证成功会返回User对象,不成功返回None

    from django.contrib import auth
    
    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)
    

    ​ login(HttpRequest,user):接受一个HttpRequest对象,以及一个验证后的对象,会在后端为这个用户生成相关的session数据;

    # 保存登录信息
    auth.login(request,user_obj)   #执行后,可以通过request.User获取到登录用户对象
    

    ​ is_authenticated(): 判断当前用户是否登录;

    request.user.is_authenticated()
    

    ​ 获取当前用户:

    user_obj = request.user
    

    ​ loginout(request): 接受一个HttpRequest,清楚当前请求的session信息。如果用户未登录,也不会报错;

    from django.contrib.auth import logout
    
    def llogout(request):
        logout(request)
    

    ​ login_required():登录认证装饰器;

    from django.contrib.auth.decorators importlogin_requird
    
    # 局部配置
    @login_required(login_url = '/xxx/')
    
    # 全局配置
    @login_required
    def home(request):
        return HttpResponse('home页面')
    	
    '''
    当用户没有登录的情况下 跳转的url有两种配置方式:
    	1.在装饰器括号内通过login_url参数局部指定
    	2.全局配置  用户没有登录的情况下 所有的视图统一跳转到一个url
    '''
    

    ​ create_user():创建用户;

    from django.contrib.auth.models import User
    # 这种方式不要使用,密码会保存为明文
    User.objects.create(username=username, password=password)
    # 使用这种方法创建普通用户
    User.objects.create_user(username=username, password=password)
    # 创建超级用户,邮箱字段必须填写
    User.objects.create_superuser(username=username, password=passwore, email='123@123.com')
    

    ​ check_password(password):检查密码,正确返回Ture,错误为False;

    ​ set_password(password):设置新密码;

    @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)
            if is_right:
                # 设置新密码
                request.user.set_password(new_password) # 此时值保存在内存中
                request.user.save()  # save()后才保存在数据库中
                return redirect('/login/')
        return render(request, 'set_password.html', locals())
    

    1.2 扩展默认表

    ​ auth模块有内置表格和字段,但是只是框架,使用时还需要其他字段信息。可以键一张一对一的auth_user表的关联表,只要继承AbstractUser即可。

    from django.contrib.auth.models import AbstractUser
    
    class UserInfo(AbstractUser)  # 注意,自定义表中字段不能与auth_user表中的字段冲突
    	phone = models.BigIntegerField()
        register_time = models.DataField(auto_now_add=Ture)
        
    def __str__(self):
        return self.username
    

    ​ 注意:采用上述方式扩展auth_user表后必须在settings.py中配置:

    AUTH_USER_MODEL = "app名.Userinfo"
    

    ​ 再注意:一旦制定了新的表,就需要在数据库中重建表,不能继续使用默认的auth_user表了。

    二、参考django 中间件配置,实现功能的插拔式设计

    ​ django的中间件可以按要求筛选信息,当不需要这个要求时,可以在settings.py中将这条筛选要求注销掉,便可以实现。这就提供了一种封装功能的方法,例如广播系统,采用短信、邮件、QQ等多种方法发布信息,可以通过在settings中实现注销方法或者是增加增加新的方法。

    ​ 思路:将各种发送信息的功能封装在不同的py文件中,都定义成鸭子类型。在配置文件中将写下功能的路径,在init文件中,对路径进行处理,使用getattr的方法,设置方法。这样新增新的方法,就可以写好方法的py文件再在配置文件中加入路径,取消方法就在配置文件中注销掉方法对应的路径即可。

    ​ notify文件夹下:

    _init_:

    import settings
    import importlib
    
    def send_all(content):
        for module_path in settings.NOTIFY_LIST:
            module, class_name = module_path.rsplit('.', maxslipt=1)
            # module = 'notify.email'  class_name = 'Email'
            mod = importlib.import_module(module)  # mod时模块名,例如email.py
            cls = getattr(mod, class_name)
            obj = cls()
            obj.send(content)
    

    ​ email.py:

    class Email(object):
        def __init__(self):
            pass   # 省略相关配置操作
        
        def send(self, content):
    		print('邮件通知:%s' % content)
    

    ​ msg.py:

    class Msg(object):
        def __init__(self):
            pass  # 省略相关配置操作
    
        def send(self,content):
            print('短信通知:%s'%content)
    

    ​ wechat:

    class WeChat(object):
        def __init__(self):
            pass  # 省略相关配置操作
    
        def send(self, content):
            print('微信通知:%s' % content)
    

    ​ qq.py:

    class QQ(object):
        def __init__(self):
            pass   # 省略相关配置操作
    
        def send(self,content):
            print('qq通知:%s'%content)
    

    ​ run.py

    import notify
    
    notify.send_all('测试信息')
    

    ​ settings.py

    NOTIFY_LIST = [
        'notify.email.Email',
        # 'notify.msg.Msg',   # 注销掉msg,可以关闭短信发送消息的功能
        'notify.wechat.WeChat',
        'notify.qq.QQ',
    ]
    
  • 相关阅读:
    安全规约
    课时作业1
    C# 操作防火墙 个人类库
    解决WinScp连接被拒绝的问题
    C# 使用WinSCP方法 类库、脚本
    【运维知识】BAT处理 延迟启动程序 临时解决网络IP获取慢导致的网络连接失败
    AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
    用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
    AngularJS实现ajax请求的方法
    AngularJS中指令的四种基本形式实例分析
  • 原文地址:https://www.cnblogs.com/tangceng/p/11774370.html
Copyright © 2011-2022 走看看