Django中的auth用法

Auth模块:用户认证html

 

咱们没用auth模块前的验证方法:authenticate
数据库

def auth_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        models.User.objects.filter(username = username,password = password).first()    
        # 咱们经过django的orm查询表里有没有对应的数据,有的话登陆成功
    return render(request,'auth_login.html')

用auth模块:django

def auth_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # models.User.objects.filter(username = username,password = password).first()
        user_obj = auth.authenticate(request,username = username,password = password)
        # 至关于执行了上面的那句,获得一个用户对象,获取到的明文密码会自动转为密文去数据库比较
        
    return render(request,'auth_login.html')

 

登陆成功后记录用户的登陆状态:auth.loginsession

# 记录用户状态
    request.session['name'] = username
    
# auth模块记录
    auth.login(request,user_obj)

# request.session保存的只是字符串,而auth保存的则是对象,一但记录了,能够在任意地方经过request.user获取到当前登陆对象, 
未登陆状态取request.user 后台会返回 AnonymousUse(匿名用户)

 

判断当前用户是否登陆:is_authenticatedapp

request.user.is_authenticated()
# 登陆返回Ture

 

退出登陆:logoutui

auth.logout(request)
# 至关于
    request.session.flush()

 

用auth模块完成注册功能时记住,用就全都用authurl

保存注册用户时:create_userspa

models.User.object.create(username=username,password=password)
User.objects.create(username=username,password=password)
# 这里保存用户不能在用create,不然密码会以明文的形式保存

User.objects.create_user(username=username,password=password)
# 建立普通用户
User.objects.create_superuser(username=username,password=password,email='123@qq.com')
# 建立超级用户,登陆后台管理系统,须要邮箱。

 

修改密码:check_password、setpasswordcode

def auth_password(request):
    print(request.user.password) # 打印出来的password是密文形式

    old_password = request.POST.get('old_password') # 获取用户输入的旧密码
    new_password = request.POST.get('new_password') # 获取用户输入的新密码

    is_res = request.user.check_password(old_password) # 去数据库比对是否正确
    if is_res:
        request.user.setpassword(new_password) # 设置新密码
        request.user.save() # 保存密码,这一步不能少,不然密码不会被修改

 

登陆验证:login_requiredorm

from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')  # 局部配置
def home(request):
    return HttpResponse('ok')
# 全局配置须要在settings中配置参数
LOGIN_URL = '/login/'

from django.contrib.auth.decorators import login_required
@login_required    # 装饰器后面不须要指定跳转页面,直接跳到全局配置的页面
def home(request):
    return HttpResponse('ok')

 

扩展默认的auth_user表

想要加一个存储用户手机号的字段

咱们能够经过继承内置的 AbstractUser 类,来定义一个本身的Model类。

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):#继承AbstractUser
    """
    用户信息表
    """
    nid = models.AutoField(primary_key=True)#这样就至关于在本身的类中能够派生出新的字段
    phone = models.CharField(max_length=11, null=True, unique=True)#
    
    def __str__(self):
        return self.username#字符串原样输出

注意:

按上面的方式扩展了内置的auth_user表以后,必定要在settings.py中告诉Django,我如今使用我新定义的UserInfo表来作用户认证。写法以下:

# 引用Django自带的User表,继承使用时须要设置,不加数据库迁移不了
AUTH_USER_MODEL = "app名.UserInfo"

再次强调:

一旦咱们指定了新的认证系统所使用的表,咱们就须要从新在数据库中建立该表,而不能继续使用原来默认的auth_user表了。

相关文章
相关标签/搜索