django之auth元件等相關內容-76
阿新 • • 發佈:2020-10-27
1 auth元件介紹
我們需要實現包括使用者註冊、使用者登入、使用者認證、登出、修改密碼等功能,內建了強大的使用者認證系統--auth,是一個app
2 內建屬性方法
資料遷移以後使用
authenticate使用者認證
from django.contrib import auth
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,password=password)
## 使用此方案
## 第一個引數必須是request物件
##username和password,從資料庫讀取資料並作匹配,自動將密碼加密匹配
user=auth.authenticate(request,username=name,password=password)
if user:
return HttpResponse('登入成功')
else:
return HttpResponse('使用者名稱或密碼錯誤')
login
from django.contrib import auth
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
name = request.POST.get('name')
password = request.POST.get('password') # 明文
user = auth.authenticate(request, username=name, password=password)
if user:
# 表示使用者登入了
# 1 存了session
# 2 以後所有的檢視函式,都可以使用request.user
auth.login(request, user) #*****
url = request.GET.get('next') # 做一個登入完跳轉的帶資料連線 http://127.0.0.1:8000/login?next=index
if url:
return redirect(url)
else:
return redirect('/index/')
else:
return HttpResponse('使用者名稱或密碼錯誤')
logout
def logout(request):
# 後續再訪問檢視函式,就沒有當前登入使用者了request.user(匿名使用者AnonymousUser)
auth.logout(request)
return redirect('/index/')
is_authenticated
# is_authenticated 返回True或者False,判斷使用者是否登入
# 用在檢視中
if request.user.is_authenticated:
print('使用者登入了')
else:
print('使用者沒有登入,匿名使用者')
# 用在模板中
{% if request.user.is_authenticated %}
{{ request.user.username }} 登入了
{% else %}
<a href="/login/">滾去登入</a>
{% endif %}
login_requierd
from django.contrib.auth.decorators import login_required
1 裝飾器,裝飾再檢視函式上,只要沒有登入,就進不來
# 必須登入後才能訪問
create_user
from django.contrib.auth.models import User
# 使用內建的create_user或者create_superuser方法
user=User.objects.create_user(username=name,password=password)
# user=User.objects.create_superuser(username=name,password=password)
check_password
from django.contrib.auth.models import User
## 有了使用者,校驗密碼是否正確
# 先獲取到使用者物件
user = User.objects.filter(username=name).first()
# 判斷密碼是否正確
flag=user.check_password(password)
set_password
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')
if request.user.check_password(old_pwd):
# 密碼正確再修改
request.user.set_password(new_pwd)
# 記住儲存(****)
request.user.save()
return redirect('/login/')
else:
return HttpResponse('原來密碼錯誤')
3 User物件的屬性
is_staff : 使用者是否擁有網站的管理許可權,是否可以登入到後臺管理
is_superuser:是否是超級管理員(如果is_staff=1,可以任意增刪查改任何表資料)
is_active : 是否允許使用者登入, 設定為 False,可以在不刪除使用者的前提下禁止使用者登入(三次密碼輸入錯誤禁用使用者)
4 擴充套件預設的auth_user表
1 內建的auth_user表,要加欄位,加不了,擴充套件該表
-方式一:一對一
-方式二,通過繼承
# 方式二:通過繼承,一定要記住再setting中配置
## 重點:使用這種方式,一開始就要用
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
# id=models.AutoField(primary_key=True)
# username = models.CharField(max_length=128)
phone = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
## setting.py中
AUTH_USER_MODEL = "app01.User"
如果專案一開始沒有擴充套件auth_user表,後期想擴充套件的操作步驟
1 備份--刪庫---》重新創建出資料庫
2 所有app的資料遷移記錄刪除migrations下除了__init__.py都刪除
3 (重要)去原始碼中刪除auth和admin 這倆app的migrations下除了__init__.py都刪除
4 資料遷移,同步到資料庫
5 備份的資料,恢復回去
5 自定義中間表(中介模型)
1 多對多關係中,第三張表的建立
-預設使用ManyToMany,自動建立
-使用中介模型
-即手動建立第三張表,又要使用好用的查詢
-完全自己寫第三張表
# 使用中介模型
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='AuthorDatail', to_field='nid', unique=True, on_delete=models.CASCADE)
class AuthorDatail(models.Model):
nid = models.AutoField(primary_key=True)
telephone = models.BigIntegerField()
birthday = models.DateField()
addr = models.CharField(max_length=64)
class Book(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_date = models.DateField()
publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE)
# 當前在哪個表中,元組中的第一個引數就是 表明_id
authors=models.ManyToManyField(to='Author',through='AuthorToBook',through_fields=('book_id','author_id'))
def __str__(self):
return self.name
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField()
class AuthorToBook(models.Model):
nid = models.AutoField(primary_key=True)
book_id = models.ForeignKey(to=Book, to_field='nid', on_delete=models.CASCADE)
author_id = models.ForeignKey(to=Author, to_field='nid', on_delete=models.CASCADE)
date=models.DecimalField()
# s1.py
import os
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day76.settings")