一、auth元件介紹
可以實作包括使用者注冊、使用者登入、使用者認證、登出、修改密碼等功能,内置了強大的使用者認證系統--auth,它其實就是一個app
二、内置屬性方法
注意:在用屬性方法前,必須進行資料庫遷移,兩條指令
1. authenticate使用者認證
settings.py 基本路徑配置好
urls.py注意每次配好路由
login.html
ps : {% csrf_token %} 用上它不用注釋csrf那個中間件了
<!DOCTYPE html><html lang="en"><head>
<meta charset="UTF-8">
<title>登入title>head><body><form action="" method="post">
{% csrf_token %}
<p>使用者名:<input type="text" name="name">p>
<p>密碼:<input type="password" name="password">p>
<p><input type="submit" value="送出">p>form>body>html>
views.py
from django.shortcuts import render, HttpResponse, redirect#from django.contrib.auth.models import Userfrom django.contrib import authdef login(request): if request.method=='GET': return render(request,'login.html') else:
name=request.POST.get('name')
password=request.POST.get('password') # 明文
## 方案行不通,密碼是密文的,永遠比對不成功
# user=User.objects.filter(username=name,password=password)
## 使用此方案,有兩個注意點
## 第一個參數必須是request對象
##必須用username和password不能用其他名,看源碼
user=auth.authenticate(request,username=name,password=password) if user: return HttpResponse('登入成功') else: return HttpResponse('使用者名或密碼錯誤')
2.login
# 調用auth後,表示使用者登入了# 1 存了session# 2 以後所有的視圖函數,都可以使用request.user,它就是目前登入使用者auth.login(request,user)
代碼:
urls.py略
order.html 這裡隻是測試下
<body>{{ request.user.username }}的訂單頁面,買了好多東西body>
index.html
<body>{{ request.user.username }}登入了body>
from django.shortcuts import render, HttpResponse, redirectfrom django.contrib.auth.models import User# 不管是否登入,都能通路
def index(request):
return render(request, 'index.html')
def order(request):
print(request.user) return render(request, 'order.html')## 使用者登入成功後存sessionfrom django.contrib import authdef login(request): if request.method=='GET': return render(request,'login.html') else:
name=request.POST.get('name')
password=request.POST.get('password') # 明文
## 此方案行不通,密碼是密文的,永遠比對不成功
# user=User.objects.filter(username=name,password=password)
## 使用此方案
## 第一個參數必須是request對象
##username和password
user=auth.authenticate(request,username=name,password=password) if user: # 調用auth,表示使用者登入了
# 1 存了session
# 2 以後所有的視圖函數,都可以使用request.user auth.login(request,user)
return HttpResponse('登入成功') else: return HttpResponse('使用者名或密碼錯誤')
3.logout
def logout(request): # 後續再通路視圖函數,就沒有目前登入使用者了request.user(匿名使用者AnonymousUser) auth.logout(request) return redirect('/index/')
oeder.html
<!DOCTYPE html><html lang="en"><head>
<meta charset="UTF-8">
<title>訂單頁面title>head><body>{{ request.user.username }}的訂單頁面,買了好多東西<br><hr><a href="/logout/">點我退出a>body>html>
4.is_authenticated
# is_authenticated 傳回True或者False,判斷使用者是否登入# 用在視圖中views.pyif request.user.is_authenticated: print('使用者登入了')else: print('使用者沒有登入,匿名使用者')# 用在模闆中index.html{% if request.user.is_authenticated %}
{{ request.user.username }} 登入了
{% else %} <a href="/login/">滾去登入{% endif %}
5.login_requierd
1 它是個裝飾器, 裝飾在視圖函數上,隻要沒有登入,就進不來# 必須登入後才能通路@login_required(login_url='/login/') #意思是如果沒有登入就重定向到/login/
from django.shortcuts import render, HttpResponse, redirectfrom django.contrib import authfrom django.contrib.auth.decorators import login_requireddef login(request): if request.method=='GET': return render(request,'login.html') else:
name=request.POST.get('name')
password=request.POST.get('password') # 明文
## 方案行不通,密碼是密文的,永遠比對不成功
# user=User.objects.filter(username=name,password=password)
## 使用此方案
## 第一個參數必須是request對象
##username和password
user=auth.authenticate(request,username=name,password=password) if user: # 調用auth,表示使用者登入了
# 1 存了session
# 2 以後所有的視圖函數,都可以使用request.user auth.login(request,user)
url=request.GET.get('next') if url: return redirect(url) else: return redirect('/index/') else: return HttpResponse('使用者名或密碼錯誤')# 必須登入後才能通路@login_required(login_url='/login/')def order(request): print(request.user) # 如何實作的?
print(request.user.username) # AnonymousUser
if request.user.is_authenticated: print('使用者登入了') else: print('使用者沒有登入,匿名使用者') return render(request, 'order.html')
6.create_user
# 使用内置的create_user或者create_superuser方法 superuser權限跟user不同user=User.objects.create_user(username=name,password=password)# user=User.objects.create_superuser(username=name,password=password)
from django.contrib.auth.models import Userdef register(request): if request.method == 'GET': return render(request, 'register.html') else:
name = request.POST.get('name')
password = request.POST.get('password') # 注冊使用者(有問題,密碼是明文)
# user=User.objects.create(username=name,password=password)
# print(user)
# 使用内置的create_user或者create_superuser方法
user = User.objects.create_user(username=name, password=password) # user=User.objects.create_superuser(username=name,password=password)
return redirect('/login/')
register.html
<!DOCTYPE html><html lang="en"><head>
<meta charset="UTF-8">
<title>注冊title>head><body><form action="" method="post">
{% csrf_token %} <p>使用者名:<input type="text" name="name">p>
<p>密碼:<input type="password" name="password">p>
<p>确認密碼:<input type="password" name="re_password">p>
<p><input type="submit" value="送出">p>form>body>html>
7.check_password 校驗密碼
## 有了使用者,校驗密碼是否正确# 先擷取到使用者對象user = User.objects.filter(username=name).first()# 判斷密碼是否正确flag=user.check_password(password)
def login(request): if request.method == 'GET': return render(request, 'login.html') else:
name = request.POST.get('name')
password = request.POST.get('password') # 明文
# 先擷取到使用者對象
user = User.objects.filter(username=name).first() # 判斷密碼是否正确
flag = user.check_password(password)
if flag:
auth.login(request, user)
url = request.GET.get('next') if url: return redirect(url) else: return redirect('/index/') else: return HttpResponse('使用者名或密碼錯誤')
8.set_password 修改密碼
from django.contrib.auth.models import User
def change_password(request): if request.method == 'GET': return render(request, 'change_pwd.html') else:
old_pwd = request.POST.get('old_pwd')
new_pwd = request.POST.get('new_pwd')
re_new_pwd = request.POST.get('re_new_pwd')#注意要核驗,不然出bug
if request.user.check_password(old_pwd): # 密碼正确再修改 request.user.set_password(new_pwd) # 一定要記住儲存(****) request.user.save() return redirect('/login/') else: return HttpResponse('原來密碼錯誤')
<body>{% if request.user.is_authenticated %}
{{ request.user.username }} 登入了 <br>
<a href="/change_pwd/">修改密碼a>{% else %} <a href="/login/">滾去登入a>{% endif %}body>
<!DOCTYPE html><html lang="en"><head>
<meta charset="UTF-8">
<title>修改密碼title>head><body><form action="" method="post">
{% csrf_token %} <p>原密碼:<input type="password" name="old_pwd">p>
<p>新密碼:<input type="password" name="new_pwd">p>
<p>确認密碼:<input type="password" name="re_new_pwd">p>
<p><input type="submit" value="送出">p>form>body>html>