auth系統的登入註冊和權限控制
創建一個管理員用戶管理站點
打入命令python manage.py createsuperuser
,按照提示輸入。
注意:必須在該虛擬環境中進行操作。同時要在項目的目錄下運行。
管理admin界面
在settings中:
- 找到LANGUAGE_CODE = ‘zh-hans’ 這個是控制將頁面上的英文轉化成中文。
- 找到TIME_ZONE = 'ASIA/Shanghai’將時區更改
向admin註冊模型
from django.contrib import admin
# Register your models here.
from .models import Department,Student,Course#這裏是導入已有的模型
#在register中註冊已有的模塊
admin.site.register(Department)
admin.site.register(Student)
admin.site.register(Course)
這樣就可以在網頁中直接對數據進行操作
自定義管理頁面
Django
提供了admin.ModelAdmin
類
通過定義ModelAdmin
的子類,來定義模型在Admin
界面的顯示方式
列表頁屬性
list_display
:顯示字段,可以點擊列頭進行排序
list_filter
:過濾字段,過濾框會出現在右側
search_fields
:搜索字段,搜索框會出現在上側
list_per_page
:分頁,分頁框會出現在下側
添加、修改頁屬性
fields
:屬性的先後順序
fieldsets
:屬性分組
注意:上面兩個屬性,二者選一。
這個是模型的代碼
class Department(models.Model):
d_id = models.AutoField(primary_key=True)
d_name = models.CharField(max_length=30)
def __str__(self):
return 'Department<d_id=%s,d_name=%s>'%(
self.d_id,self.d_name
)
class Student(models.Model):
s_id = models.AutoField(primary_key=True)
s_name = models.CharField(max_length=30)
department = models.ForeignKey('Department')
course = models.ManyToManyField('Course')
def __str__(self):
return 'Student<s_id=%s,s_name=%s>'%(
self.s_id,self.s_name
)
class Course(models.Model):
c_id = models.AutoField(primary_key=True)
c_name = models.CharField(max_length=30)
def __str__(self):
return 'Course<c_id=%s,c_name=%s>'%(
self.c_id,self.c_name
)
對模型註冊後臺的顯示格式
-
創建對應的類
from .models import Department,Student,Course class DepartmentAdimin(admin.ModelAdmin): list_display = ['d_id','d_name']#分別顯示它的id和部門名字 list_display_links = ['d_id','d_name']#設置字段可以點擊進入編輯界面 list_filter = ['d_id']#過濾框,會出現在右側。 search_fields = ['d_name']#加入搜索框 class StudentAdimin(admin.ModelAdmin): list_display = ['s_id','s_name'] list_display_links = ['s_id','s_name'] # fields = ['s_name','course','department'] fieldsets = [ ('一組',{'fields':['s_name']}), ('二組',{'fields':['department','course']}) ] class CourseAdmin(admin.ModelAdmin): list_display = ['c_id','c_name'] list_display_links = ['c_id','c_name'] list_per_page = 5
- 讓格式起作用必須要繼承以上的類
admin.site.register(Department,DepartmentAdimin)
admin.site.register(Student,StudentAdimin)
admin.site.register(Course,CourseAdmin)
User用戶創建
from django.contrib.auth.models import User
User.objects.create_user(username=username,password=password,email=email)#這個就是用auth創建一個用戶,這是一個內置表。
驗證用戶的存在
from django.contrib.auth import authenticate
user = authenticate(username=username,password=password)#這個就是驗證系統
if user is not None:
# 這個用戶存在
else:
# 這個用戶不存在
加上上面的驗證代碼,下面是實現基本的登入
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']#獲取請求裏面的數據
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:#查看數據庫中是否存在該用戶信息
if user.is_active:
login(request, user)#保存用戶的登入狀態
# 登錄成功
else:
# 用戶沒有被激活,不能登錄
else:
# 用戶名或者密碼錯誤
退出功能
from django.contrib.auth import logout
def logout_view(request):
logout(request)#將該用戶的session清除。
用戶至上
在用戶沒有登入成功時,用戶肯定不想看到一個404的報錯頁面,而是其它他能看的懂得提示頁面
下面的操作可以提供舒適
login_required
裝飾器,可以讓頁面自動跳轉。
from django.contrib.auth.decorators import login_required
@login_required#驗證登入裝飾器
def auto_view(request):
return 後面是要渲染的頁面
在settings裏面設置屬性
LOGIN_URL
="/appname/視圖名字
"這個就是,當用戶訪問沒有權限的網站的時候,就會自動的跳轉的這個路徑上去。
這裏存在的問題
不同的用戶設置不同的權限又怎麼實現呢?
下面,給用戶設置門檻,也就是裝飾器
裝飾器總結:
- login_required設置登入驗證
- permission_required設置權限驗證
權限的設置,在數據庫中的auth_permissions中詳細記錄。在mysql中打入你連接的數據庫,輸入show tables; ,然後再輸入 select ✳ from auth_permissions;查看權限設置
ex:
權限判斷
from django.contrib.auth.decorators import permission_requred
from django.http import HttpResponse
def pems_add(request)#給用戶添加權限
user = User.object.filter(name = "")#先獲取到對象
pems = Permission.objects.filter(codename = "權限名")#獲取權限
user.user_permissions.add(pems)#添加權限
return HttpResponse("權限註冊成功")
@permission_required("appname.codename")#這個是驗證權限
def add(request):#只有擁有添加權限的用戶才能調用此視圖函數
pass