author認證模塊
用auth模塊 你就用全套 不是自己寫一部分 用別人一部分
創建超級管理員,用於登錄DJango admin的后台管理
命令:createsuperuser,輸入順序用戶名》郵箱》密碼》確認密碼。
注意:所有密碼一定要設為為密文
登錄實例:
views.py
from django.shortcuts import render
# Create your views here.
from django.contrib import auth
from django.contrib.auth.models import User
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user_obj = auth.authenticate(username=username,password=password)
if user_obj:
print(user_obj)
print(user_obj.username)
print(user_obj.password)
auth.login(request,user_obj) # 執行完這一句只要能夠拿到request的地方都可以通過request.user獲取當前登錄用戶對象
"""該方法會主動幫你操作session表 並且只要執行了該方法
你就可以在任何位置通過request.user獲取到當前登錄的用戶對象
"""
return render(request,'login.html')
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<p>username:<input type="text" name="username"></p>
<p>password:<input type="text" name="password"></p>
<input type="submit">
</form>
</body>
</html>
該方法會有一個返回值 當條件存在的情況下 返回就是數據對象本身條件不滿足 直接返回None
,返回密碼為密文
pbkdf2_sha256$36000$BcE7QVE95n4A$55xwX93B60dEIqKJcXd24+VoEVY4d0CtaTPkwmSDMhc=。
變化:
驗證auth.login(request,user_obj)
為了方便,節省代碼量。我們需要使用全局配置,在settings:
# auth校驗用戶是否登錄 全局配置跳轉url
LOGIN_URL = '/login/'
效果可以刪除django_session中的數據,重新登錄
修改密碼:
views.py
# 繼承上邊代碼
from django.contrib.auth.decorators import login_required
@login_required
def set_password(request):
if request.method == 'POST':
old_password = request.POST.get('old_password')
new_password = request.POST.get('new_password')
# 校驗原密碼對不對
is_right = request.user.check_password(old_password)
print(is_right)
if is_right:
# 修改密碼
request.user.set_password(new_password) # 僅僅只會在內存中產生一個緩存 並不會直接修改數據庫
request.user.save() # 一定要點save方法保存 才能真正的操作數據庫
return redirect('/login/')
return render(request,'set_password.html',locals())
set_password.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<p>username<input type="text" disabled value="{{ request.user.username }}"></p>
<p><input type="text" name="old_password"></p>
<p><input type="text" name="new_password"></p>
<input type="submit">
</form>
</body>
</html>
注冊功能演示:
views.py
def register(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# models.User.objects.create(username=username,password=password)
# User.objects.create(username=username,password=password) # 不用使用create 密碼會直接存成明文
# User.objects.create_user(username=username,password=password) # 創建普通用戶
User.objects.create_superuser(username=username,password=password,email='123@qq.com') # 創建超級用戶 郵箱字段必須填寫
#
return render(request,'register.html')
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<p>username:<input type="text" name="username"></p>
<p>password:<input type="text" name="password"></p>
<input type="submit">
</form>
</body>
</html>
擴展auth_user字段
-
利用一對一表關系,擴展字段
-
自己寫一個默寫類,繼承原來的auth_user類,然后在settings配置文中告訴Django使用新建的類代替原來的auth_user 表,因為已經創建完模型庫,所以只能換庫或者換項目。
這里更換成MySQL數據庫
建表:
models.py
from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. class Userinfo(AbstractUser): """ 強調 你繼承了AbstractUser之后 你自定義的表中 字段不能跟原有的沖突 """ phone = models.BigIntegerField() avatar = models.FileField() register_time = models.DateField(auto_now_add=True)
一定要在settings 中指定
# auth自定義表配置
AUTH_USER_MODEL = 'app01.Userinfo'
# 固定語法: AUTH_USER_MODEL = '應用名.表名'
通過上邊的方式繼承的表,還是可以繼續使用auth模塊所有的功能
基於中間件 參考源碼 設計自己的功能可插拔式設計
總結:類似於Django中的settings文件,舍棄大量的局部配置文件,該用全局配置文件。