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表了。