标签:很多 函数 superuser htm setting user dir use 直接
用户认证组件简介
之前是把is_login=True放在session里来判断用户是否登录
之前的操作,在覆盖的时候有问题。
例如两个用户,第一个用户key-value多,第二个少覆盖可能会保留有第一个的
用session保存用户登录状态。使用组件
用户认证组件的前提:
功能:用session记录登录验证状态(不记录上次登录时间那些)
前提:不能用自己的用户表了。要用Django自带的auth_user用户组件认证表。
不妨碍扩展其他字段。可以做一对一,一对多等
创建超级用户:python manage.py createsuperuser
API
封装在auth模块中了:
from django.contrib import auth
def login(request):
user=request.POST.get("user")
pwd=request.POST.get("pwd")
#验证通过返回user对象,不通过返回None
user=auth.authenticate(username=user,password=pwd)
#PS:可以自己来吗?from django.contrib.auth.models import User
#不得行,因为密码是加了密的,没必要干重复的事
if user:
auth.login(request, user)
# 一旦注册session,把这个就变成了--
#在所有的视图函数和模板(模板里不用传都能用)都可以获取的request.user
#request.user表示当前登录对象 request.user==user
#没有登录是匿名对象,AnonymousUser,
#request.user.is_anonymous或request.user.id==None
#或request.user.user==‘‘或request.user.is_authenticated
#来判断用户是否登录
注册功能
def reg(request):
user=request.POST.get("user")
pwd=request.POST.get("pwd")
User.objects.create_user(username=user,password=pwd) #还有create_superuser方法,密码入库是加密的
#改密码
user = User.objects.get(username=‘‘)
user.set_password(password=‘abc‘)
user.save()
总结:
from django.contrib import auth
1.验证登录:user=auth.authenticate(username=user,password=pwd)
2.注册登录:user=auth.login(request, user)
3.注销:auth.logout(request)
4.是否已经登录:request.user.is_authenticated
5.添加用户:User.objects.create_user(username=user,password=pwd)
PS:
request.user是一个全局变量。可以在视图中使用,在模板中不用传参可以直接用
补充:
匿名用户对象:
request.user.is_anonymous==True
request.user.id==None
request.user.user==‘‘
认证装饰器:
比如很多视图函数都要“已经登录才能看”
可以用Django自带的装饰器解决@login_required
不认证跳转到LOGIN_URL="/index/"是自己在settings.py里配的
实际跳转到:127.0.0.1:8000/login/?next=/order/
所以在视图函数中:
登录成功应该重定向到return redirect(request.GET.get("next","/index/"))
@login_required
def order(request):
#if not request.user.is_authenticated:
# return redirect("/login/")
return render(request,"order.html")
标签:很多 函数 superuser htm setting user dir use 直接
原文地址:https://www.cnblogs.com/staff/p/10738088.html