目录
django提供的auth认证组件,提供了: 用户表的构建方式(用于满足符合auth组件);提供了认证接口;提供了会话登录和会话注销的接口 ;提供了中间件将会话登录用户保存到request对对象中,这样可以很轻易的拿到登录用户,不用我们再从会话中获取用户id,再通过model获取到用户对象;对于认证接口要提供用户名和密码传入auth.authenticate(username,password),认证成功,就可以得到认证用户对象。我们只需要根据认证结果是否有对象,来判定认证结果,来进行后面的操作。同时返回的用户对象传入auth.login(request, user)接口,调用接口,可以将用户登录信息记录到session中,并且如果添加了auth的一个中间件authenticationmiddleware,那么每次请求会在request.user中保存该登录的用户对象。如果没登陆request.user会保存一个anonymouseuser用户,这样就可以通过request.user的api来判定本次请求是否是某个用户登录状态。这点是auth组件关键点,这也是涉及到隐含session记录创建和auth中间件对request对象的操作。
from django.contrib.auth.models import abstractuser from django.db import models class users(abstractuser): age = models.integerfield(verbose_name='年龄', blank=true, null=true) telephone = models.charfield(verbose_name='手机号', max_length=32) address = models.charfield(verbose_name='住址', max_length=255) def __str__(self): return self.username # username属性继承自abstractuser
方便在模版系统中渲染登录用户的信息。前提是使用auth组件进行会话登录及其中间件。
即 auth.authenticate() 与 request.user.is_authenticated 的使用场景和功能区别:
导入语句: from django.contrib.auth.decorators import login_required
用法:用于装饰需要视图函数;使用了该装饰器的函数,会判定是否已登录用户,如果没有将重定向到settings.login_url指定的url并带上一个next参数,next参数传入当前视图访问的绝对路径,已用于在登录后跳转的路径。这样,login视图在登录成功后的跳转,就可以从next提交的值获取,并设置一个获取不到的默认值为'index'首页就可以了。很方便的装饰器和其修改的next参数,其中next可用于模版中。
用法:
@login_required def list_customer(request): """ 查看用户列表 :param request: :return: """ pass return httpresponse('用户列表')
如果要自定义,可以继承abstractuser这个抽象model。这就涉及到了model的继承。抽象继承属于model继承的table_per_class模式。
user model提供了创建user object 的接口create_user();修改密码的接口user.set_password()。这个操作普通model直接操作create,update数据不同,必须通过接口,因为密码是加密存储的。
# 登录验证页面 def login(request): if request.method == 'post': response = { 'user': none, 'msg': none, } login_name = request.post.get('username') # 因为使用的是ajax提交表单数据,对于表单数据的校验就放到前端吧. pwd = request.post.get('password') valid_code = request.post.get('valid_code') if valid_code.upper() == request.session['valid_code'].upper(): # 只做验证码校验和用户认证校验。 user = auth.authenticate(username=login_name, password=pwd) if user: auth.login(request, user) # 这样request.user 就会有当前登录对象 response['user'] = user.username return jsonresponse(response) else: response['msg'] = '用户名或密码错误!' return jsonresponse(response) else: response['msg'] = '验证码错误!' return jsonresponse(response) return render(request, 'myblog/login.html')
如对本文有疑问, 点击进行留言回复!!
老猿学5G:融合计费场景的离线计费会话的Nchf_OfflineOnlyCharging_Release释放操作
老猿学5G扫盲贴:中国移动5G融合计费漫游计费架构和路由方案
老猿学5G扫盲贴:与用户和终端相关的名词UE、SUPI、GPSI、PEI
三星以核心技术优势持续更新折叠手机,华为缺乏自主技术无力应对
网友评论