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='[email protected]')

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

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

扫描二维码关注公众号,回复: 7702933 查看本文章
@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',
]

猜你喜欢

转载自www.cnblogs.com/tangceng/p/11774370.html