用户登陆认证组件——网课内容
组件介绍
简介
功能
用session记录登陆验证状态
前提
用户表——用auth_user表(django建表的时候默认创建的)——也可以自己拓展表
terminal中创建超级用户
python manage.py createsuperuser
然后在表auth_user中可以看到记录
常用的API
auth模块里的
from django.contrib import auth
authenticate
如果验证成功返回user对象,失败返回None
特别注意,这里是从数据库中的固定表auth_user表中查询的
auth_user表中的数据是创建“超级用户的用户名跟密码”!
whw whw12345
#username与password也是auth_user表的字段 user = auth.authenticate(username=user,password=pwd)
login
通过session有一个request.user对象:request.user=user
#request.user为当前登陆对象 auth.login(request, user)
logout
注销
def logout(request): auth.logout(request) return redirect('/login/')
user对象里的
from django.contrib.auth.models import User
对应的是auth_user表
is_authenticated()
判断用户是否已经登录了 登录了返回True,没登录返回Fasle
create_user方法
user = User.objects.create_user(username=user,password=pwd)
重点总结
用的最多的是 request.user
if not auth.login(request,user):
request.user等于一个匿名用户对象AnnoymousUser() if auth.login(request,user): 表示登陆了,
request.user等于当前登陆对象,且是一个全局变量,可以在任何视图与模板中直接使用!!
————最大的优点是,只要登陆了直接用 request.user就可以了!
+++++++++++++++++++++++++++++++
用户认证装饰器
引入
from django.contrib.auth.decorators import login_required
使用
@login_required #自动会跳转一个路径 def home(request): # if request.user.is_authenticated(): #判断用户是否已经登录了 return render(request,'home.html')
配置跳转路径
settings配置文件:
LOGIN_URL = '/login/'
具体实例
1、路由
from django.contrib import admin from django.urls import path,re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), re_path('^login/$',views.login), re_path('^index/$',views.index), re_path('^logout/$',views.logout), re_path('^register/$',views.register), re_path('^order/$',views.order), ]
2、models.py
————必须注意,用的不是这个app01_auth表,而是django生成的auth_user表!!!
from django.db import models class Auth(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32)
3、视图views.py
##注意引入的东西 from django.shortcuts import render,HttpResponse,redirect from django.contrib import auth from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required def login(request): if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') ##如果验证成功返回user对象,失败返回None ###特别注意,这里是从数据库中的固定表auth_user表中查询的 ###auth_user表中的数据是创建“超级用户的用户名跟密码”! ###whw whw12345 ###username与password也是auth_user表的字段 user = auth.authenticate(username=user,password=pwd) if user: ##通过session有一个request.user对象:request.user=user ##request.user为当前登陆对象 auth.login(request, user) ##用“装饰器”实现的时候,这里不写死,。根据“之前想要访问的网站”返回响应的页面 # next_url = request.GET.get('next') # return redirect(next_url) ##但是不用装饰器实现的话还是写死!否则会报错 return redirect('/index/') return render(request,'login.html') ##index def index(request): # print('request.user:',request.user) #request.user: whw print('request.user.username:',request.user.username)#固定的 request.user.username: whw print('request.user.id:',request.user.id)#固定的 request.user.id: 2 ##是否是匿名的 request.user.is_anonymous: False;True表示没有登陆过;False表示登陆认证成功 print('request.user.is_anonymous:',request.user.is_anonymous) ##登陆验证过的话: ''' 也可以: if request.user.is_authenticated(): return render(request, 'index.html',locals()) ''' if request.user: return render(request, 'index.html',locals()) ##没有验证成功跳转到登录界面 else: return redirect('/login/') ##order——利用装饰器实现 @login_required def order(request): # if not request.user.is_authenticated: # return redirect('/login/') ##认证成功才返回order.html页面 return render(request,'order.html') ##注销 def logout(request): auth.logout(request) return redirect('/login/') ##注册 def register(request): ##往auth_user表添加记录 if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') ##create_user方法! user = User.objects.create_user(username=user,password=pwd) #注册成功跳转到登录页面 return redirect('/login/') return render(request,'register.html')
4、login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <h3>登陆</h3> <form action="" method="post"> {% csrf_token %} 用户名: <input type="text" name="user"> 密码: <input type="text" name="pwd"> <input type="submit" value="提交"> </form> </body> </html>
5、index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Index</title> </head> <body> {# 注意这里用request取值 #} <p>Hello!{{ request.user.username }}</p> <p><a href="/logout/">注销</a></p> </body> </html>
6、order.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Order</title> </head> <body> Order! </body> </html>
7、register.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册</title> </head> <body> <h3>注册</h3> <form action="" method="post"> {% csrf_token %} 用户名: <input type="text" name="user"> 密码: <input type="text" name="pwd"> <input type="submit" value="注册"> </form> </body> </html>
all