auth模块

1. 什么是auth模块

Auth模块是Django自带的用户认证模块:

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。

Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。

 

2. auth模块常用方法

2.1 注册  create_user()   create_superuser()

def register(request):
    if request.method == 'GET':
        return render(request, 'register.html')
    else:
        username = request.POST.get('username')
        password = request.POST.get('password')
        surepassword = request.POST.get('surepassword')
        print(username, password, surepassword)
        if password == surepassword:
            User.objects.create_user(username=username, password=password)
            return render(request, 'login.html')
        else:
            return render(request, 'register.html')

2.2 登录  用户验证函数  authenticate()

from django.contrib import auth

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        username = request.POST.get('username')
        password = (request.POST.get('password'))

        user_obj = auth.authenticate(request, username=username, password=password)   # (验证用户账号密码是否正确, request可以不用写)
        if user_obj:
            auth.login(request, user=user_obj)
            # 作用:
            # 1. 设置cookie, session
            # 2. 生成request.user的对象, 这个对象可以再视图函数中使用 
            # 3. request.user这个对象  相当于 request.session

            return render(request,'main.html', {'username':username})
        else:
            return redirect('/common/fail/')

 

2.3 验证(登录认证装饰器)is_authenticated()

2.3.1 验证用户是否已经登录(is_authenticated())

def my_view(request):
  if not request.user.is_authenticated():
    return redirect('/login/')

 

2.3.2 登录认证装饰器(@login_required())

from django.contrib.auth.decorators import login_required
@login_required(login_url='/common/login/')

# 不需要自己写装饰器了,先导一个模块,然后@login_required(login_url='/common/login/'),如果登录了,则继续执行,没有登录,则调到登录界面

 

如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改

LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由

2.4 修改密码 (check_password, set_password)

def modify(request):
    if request.method == 'GET':
        return render(request, 'modify.html')
    else:
        username = request.POST.get('username')
        password = request.POST.get('password')
        new_password = request.POST.get('new_password')
  
        res = request.user.check_password(password)  # 查询原密码是否正确
        if res:
            request.user.set_password(new_password)  # 设置新密码
            request.user.save()
            return render(request, 'login.html')
        else:
            return render(request, 'modify.html')

2.5 注销

def logout(request):
    auth.logout(request)
    return render(request, 'login.html')

3. 扩展默认的auth user表中的数据

auth_user表字段都是固定的那几个,我在项目中没法拿来直接使用啊!

我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。

这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了。

from django.contrib.auth.models import AbstractUser
class UserInfo(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表了。

 

posted on 2019-08-03 12:18  软饭攻城狮  阅读(122)  评论(0编辑  收藏  举报

导航