學習筆記,僅供參考
文章目錄
- Web請求認證
- 使用者認證authenticate
- 使用者登入login
- 使用者登出logout
- 舉個例子
Web請求認證
- 相關函數
from django.contrib.auth import authenticate, login, logout
使用者認證authenticate
- 函數用法
authenticate(username='使用者名', password='原始密碼')
該函數可以驗證使用者名和密碼是否合法,如果合法則傳回User模型類的對象,如果不合法傳回None
- 官方示例
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
# 通過認證
else:
# 沒有通過認證
在這個函數中,它不僅檢查了我們輸入的使用者名和密碼是否和存儲的相比對,還檢查了id_active是否為True。
使用者登入login
- 函數用法
login(request, user)
#user為User模型類建立的使用者對象
#request為HttpRequest對象
該方法使用Django的session架構,将使用者的資訊儲存在session中。
- 示例
from django.contrib.auth import authenticate, login
def login_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
#使用者的資訊儲存在session中
# 重新指定登陸成功頁
else:
# 傳回一個無效的登陸資訊
使用者登出logout
- 函數用法
logout(request)
通過
django.contrib.auth.login()
登入的使用者,可以使用
django.contrib.auth.logout()
退出登陸
- 示例
from django.contrib.auth import logout
def logout_view(request):
logout(request)
舉個例子
- 舉個例子1
現在,我們用我們的admin管理者賬号來示範使用者認證,使用者登入和使用者登出.
在myuser應用下的views.py子產品中,我們建立兩個視圖處理函數,用于使用者認證、使用者登入和使用者登出:
from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import models
from django.contrib.auth import authenticate, login, logout
# Create your views here.
def mylogin(request):
if request.method == "GET":
return render(request, 'myuser/login.html', locals())
elif request.method == "POST":
username = request.POST.get('username', '')
password = request.POST.get('password', '')
try:
user = authenticate(username = username,
password = password)
if user is not None:
login(request, user)
# print(request.session)
return HttpResponse("登陸成功...")
else:
return HttpResponse("登入失敗...")
except:
return HttpResponse("沒有此使用者...")
def mylogout(request):
# print("mylogout運作了...")
logout(request)
return HttpResponse("登出...")
在myuser應用下的urls.py子產品中,我們建立兩個路由:
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r'^login/$', views.mylogin),
re_path(r'^logout/$', views.mylogout),
]
現在,我們向admin資料庫背景管理系統http://127.0.0.1:8000/admin/發起請求:
出現登入頁面,也就是說,目前我們的并沒有登入管理者賬号。
現在,我們向http://127.0.0.1:8000/myuser/login/發起請求,并登入:
登入成功後,我們再重新整理一下admin資料庫背景管理系統:
發現我們已經登入啦!這是因為我們用login函數登入後,我們的賬号資訊就儲存在了session中,此時,我們就處于登入狀态了。
現在,我們向http://127.0.0.1:8000/myuser/logout/發起通路,再重新整理一下admin資料庫背景管理系統:
我們發現,我們的管理者賬号已經被登出了。
- 舉個例子2
現在,我麼基于上一個例子的代碼,寫一個注冊界面。
首先,我們在myuser應用的urls.py檔案中,添加1個路由:
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r'^login/$', views.mylogin),
re_path(r'^logout/$', views.mylogout),
re_path(r'^reg/$', views.myreg),
]
在在myuser應用的views.py子產品中,添加一個視圖函數:
def myreg(request):
if request.method == "GET":
return render(request, 'myuser/register.html')
elif request.method == "POST":
username = request.POST.get('username', '')
password = request.POST.get('password', '')
#這裡我們先不做使用者認證
try:
user = models.User.objects.create_user(
username = username,
password = password
)
user.save()
return HttpResponse("注冊成功...")
except:
return HttpResponse("注冊失敗...")
現在,我們向http://127.0.0.1:8000/myuser/reg/發起請求,并填入注冊資訊:
點選注冊:
mysql> select id, username, email, is_superuser from auth_user;
+----+------------+----------------------+--------------+
| id | username | email | is_superuser |
+----+------------+----------------------+--------------+
| 1 | goatbishop | [email protected] | 1 |
| 2 | darkgoat | | 0 |
+----+------------+----------------------+--------------+
2 rows in set (0.01 sec)