auth模块 + 插拔式思想

Posted tangceng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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',
]

以上是关于auth模块 + 插拔式思想的主要内容,如果未能解决你的问题,请参考以下文章

Auth模块插拔式设计BBS表设计

☆Django☆---中间件 csrf跨站请求伪造 auth模块 settings功能插拔式源码

Python Django 生命周期 中间键 csrf跨站请求伪造 auth认证模块 settings功能插拔式源码

CMDB 资产采集——插件可插拔式可拓展思想

带你手写基于 Spring 的可插拔式 RPC 框架通信协议模块

Django框架