auth模块
在Django中创建数据库,会自动生成一个user表,表中有很多字段其中username, password(必填项)password用哈希算法保存到数据库导入auth模块from django.contrib import authdjango.contrib.auth中提供了许多方法,这里主要介绍其中的三个:
1.authenticate()
提供了用户认证,即验证用户名以及密码是否正确,一般需要username password两个关键字参数如果认证信息有效,会返回一个 User 对象。authenticate()会在User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。直接从user表中拿数据对比user = auth.authenticate(username=username, password=pwd)
2.login(HttpRequest, user)
必须时认证成功的用户才能用,此函数使用django的session框架给某个已认证的用户附加上session id等信息session不能存放对象,而login将用户这个对象存起来,后续用到用户信息直接调用即可如 print(request.user.username)user = auth.authenticate(username=username, password=pwd)if user: # 将登录的用户封装到request.user auth.login(request, user)
3.logout(request) 注销用户
def logout(request): auth.logout(request) 相当于request.session.flush() return redirect("/login/")当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
4.装饰器:login_requierd()
使用@login_required能实现的功能:1 用户登陆后才能访问某些页面,2 如果用户没有登录就访问该页面的话直接跳到登录页面3 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址from django.contrib.auth.decorators import login_required@login_requireddef index(request):pass若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings.py文件中通过LOGIN_URL进行修改)在setting中添加:# 如果没有登录,默认跳转到那个URLLOGIN_URL = "/login/"
User对象
User 对象属性:username, password(必填项)password用哈希算法保存到数据库
1.is_authenticated()
如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。通过认证并不意味着用户拥有任何权限,在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name@login_requireddef index(request): ret = request.user.is_authenticated() print(ret) return render(request, "index.html")
2. create_user创建用户
from django.contrib.auth.models import Useruser = User.objects.create_user(username='',password='',email='')
3.check_password(passwd)校验密码
ret = user_obj.check_password("alex1234")正确返回True,错误为False
4.set_password() 修改密码
user_obj.set_password("alex3714") user_obj.save() def register(request): from django.contrib.auth.models import User # User.objects.create(username="alex", password="alexdsb") # 密码为明文,不用这个 创建用户 user_obj = User.objects.create_user(username="alex5", password="alexdsb") # 校验密码是否正确 ret = user_obj.check_password("alex1234") print(ret) # 修改密码 user_obj.set_password("alex3714") user_obj.save() return HttpResponse("o98k")
手动创建认证
<h1>欢迎来到家目录</h1> <h3>这是{{ use_obj.username }}的家目录</h3> <a href="/logout/"><h4>注销</h4></a>

from functools import wraps def check_login(func): @wraps(func) def inner(request,*args,**kwargs): rep=request.session.get('is_login') if rep: return func(request,*args,**kwargs) else: return render(request,"login.html") return inner def login(request): if request.method=='POST': name=request.POST.get("username") pwd=request.POST.get("passwd") print(name,pwd) user=models.Userinfo.objects.filter(username=name,passwd=pwd) #得到quersty if user: request.session['is_login']='1' ##也可设置其他项,表中有很多字段,一个个设置比较麻烦,可直接设置id,找到其他的信息 request.session['user_id']=user[0].id ###user是个列表 print(request.session.get('user_id')) return redirect("/home/") return render(request,"login.html") @check_login def home(request): use_id=request.session.get('user_id') use_obj=models.Userinfo.objects.get(id=use_id) return render(request,"home.html",{"use_obj":use_obj}) def logout(request): request.session.flush() return render(request,"login.html")
注册示例代码

def sign_up(request): state = None if request.method == 'POST': password = request.POST.get('password', '') repeat_password = request.POST.get('repeat_password', '') email=request.POST.get('email', '') username = request.POST.get('username', '') if User.objects.filter(username=username): state = 'user_exist' else: new_user = User.objects.create_user(username=username, password=password,email=email) new_user.save() return redirect('/book/') content = { 'state': state, 'user': None, } return render(request, 'sign_up.html', content)
修改密码示例

@login_required def set_password(request): user = request.user #auth.login(request, user),得到已经封装的用户对象 state = None if request.method == 'POST': old_password = request.POST.get('old_password', '') new_password = request.POST.get('new_password', '') repeat_password = request.POST.get('repeat_password', '') if user.check_password(old_password): if not new_password: state = 'empty' elif new_password != repeat_password: state = 'repeat_error' else: user.set_password(new_password) user.save() return redirect("/log_in/") else: state = 'password_error' content = { 'user': user, 'state': state, } return render(request, 'set_password.html', content)
扩展自带的auth_user
1.新建一个表, 一对一关联上面的auth_user表
在models写入:from django.contrib.auth.models import Userclass UserDetail(models.Model): phone = models.CharField(max_length=11) user = models.OneToOneField(to=User) 不加引号,关联自己创建的表时加引号
2.继承的方式
from django.contrib.auth.models import AbstractUserclass UserInfo(AbstractUser): phone = models.CharField(max_length=11) addr = models.CharField(max_length=128)相当于对默认的auth_user表做了扩展, 并且代替auth_user。auth_user不再存在注意: 在settings.py中一定要加 AUTH_USER_MODEL = 'app名.类名'
# 告诉Django项目用哪张表做认证AUTH_USER_MODEL = 'blog.UserInfo'
def register(request): from django.contrib.auth.models import User 创建用户 user_obj = User.objects.create_user(username="alex5", password="alexdsb")使用继承后,就没有User了,创建新用户需要改变def register(request):from app01 import models user_obj = modles.Userinfo.objects.create_user(username="alex5", password="alexdsb"
来源:https://www.cnblogs.com/zgf-666/p/9124261.html