咱們學生管理之登陸實現一文中已經瞭解了本身寫一個登陸邏輯的過程:html
urlpatterns = [
url(r'^login/$', views.login),
url(r'^index/$', views.index),
url(r'^logout/$', views.logout),
]
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
user = models.User.objects.filter(username=username, password=password).first()
if user:
# 登錄成功
request.session["is_login"] = "1"
request.session["user_id"] = user.id
# 1. 生成特殊的字符串
# 2. 特殊字符串當成key,在數據庫的session表中對應一個session value
# 3. 在響應中向瀏覽器寫了一個Cookie Cookie的值就是 特殊的字符串
return redirect("/index/")
return render(request, "login.html")
有一些內容是須要用戶登陸以後才能查看,因此這裏就涉及到了登陸限制。剛開始我寫登陸的時候經過裝飾器來實現:數據庫
from functools import wraps
def login_required(f):
@wraps(f)
def inner(request, *args, **kwargs):
if request.session.get("is_login") == "1":
return f(request, *args, **kwargs)
else:
return redirect("/login/")
return inner
@login_required
def index(request):
user_id = request.session.get("user_id")
# 根據id去數據庫中查找用戶
user_obj = models.User.objects.filter(id=user_id).first()
if user_obj:
return render(request, "index.html", {"user": user_obj})
else:
return render(request, "index.html", {"user": "匿名用戶"})
def logout(request):
request.session.flush()
return redirect("/login/")
本身實現登陸流程的話,通常是通過以上4個步驟。可是,Django是一個大而全的框架,它早已經爲你寫好了登陸模塊。django
既然是已經寫好的模塊,那麼咱們就能夠開箱即用!flask
使用Django自帶的Auth模塊,只要直接使用裏面寫好的方法就行。後端
同上。瀏覽器
def login(request):
if request.method == "POST":
#獲取用戶提交數據
username = request.POST.get("username")
pwd = request.POST.get("password")
# 如何判斷用戶名和密碼對不對
user = auth.authenticate(username=username, password=pwd)
if user:
ret = user.is_authenticated()
# 將登陸的用戶封裝到request.user
auth.login(request, user)
return redirect("/index/")
return render(request, "login.html")
導入裝飾器session
from django.contrib.auth.decorators import login_required
使用裝飾器app
@login_required
def index(request):
ret = request.user.is_authenticated()
return render(request, "index.html")
注意:須要在setttings中設置參數LOGIN_URL = "/login/",這樣若是檢測到須要登陸的頁面沒有登陸,則會直接跳轉到:http://localhost:8000/login/?next=/index/框架
def logout(request):
auth.logout(request)
return redirect("/login/")
登出其實就是清理工做。函數
從上能夠看出,其實總體流程仍是同樣,只是auth模塊幫咱們寫好了一些邏輯,咱們只要調用其方法便可。
咱們在上面能夠看到auth模塊有一張已經生成好的用戶表,包括username、passwd、email、last_date。。。等等,可是若是咱們但願本身增長一些定製化的字段,怎麼操做呢?
擴展流程:
一、新建一張表,繼承AbstractUser
from django.contrib.auth.models import AbstractUser
models中新增字段:
class UserInfo(AbstractUser):
phone = models.CharField(max_length=11)
addr = models.CharField(max_length=128)
至關於對默認的auth_user表作了擴展, 而且代替auth_user
二、生成數據表makemigrations
三、添加變量
在settings.py中必定要加AUTH_USER_MODEL = 'app名.類名'
# 若是使用繼承的方式 使用內置的auth模塊,要在settings.py裏面配置 默認用戶認證時使用的是哪張表
AUTH_USER_MODEL = 'app01.UserInfo'
這樣,就擴展了auth模塊自帶的user表。
Django真的很全,使用的時候你就會感受到,能想到的功能,Django基本上都幫你實現了,真棒!
authenticate方法會在該 User 對象上設置一個屬性來標識後端已經認證了該用戶,且該信息在後續的登陸過程當中是須要的。
user = authenticate(username='theuser',password='thepassword')
該函數接受一個HttpRequest對象,以及一個通過認證的User對象。
該函數實現一個用戶登陸的功能。它本質上會在後端爲該用戶生成相關session數據。
if user_obj: login(request, user_obj) # 跳轉到登陸成功頁面 ... else: # 返回錯誤信息 ...
該函數接受一個HttpRequest對象,無返回值。
當調用該函數時,當前請求的session信息會所有清除。該用戶即便沒有登陸,使用該函數也不會報錯。主要是清理session工做。
request.session.flush()
該方法用來判斷用戶是否通過了認知
def my_view(request): if not request.user.is_authenticated(): return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
from django.contrib.auth.decorators import login_required @login_required def my_view(request): ...
from django.contrib.auth.models import User user_obj = User.objects.create_superuser(username='用戶名',password='密碼',email='郵箱',...)
auth 提供的一個檢查密碼是否正確的方法,須要提供當前請求用戶的密碼。
密碼正確返回True,不然返回False。
ret = user_obj.check_password('密碼')
auth 提供的一個修改密碼的方法,接收 要設置的新密碼 做爲參數。
注意:設置完必定要調用用戶對象的save方法!!!
user_obj.set_password('新密碼') user_obj.save()
User.objects.create_user(username='用戶名',password='密碼',email='郵箱',...)