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):设置新密码;
@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',
]
原文地址:https://www.cnblogs.com/tangceng/p/11774370.html