django权限管理
當(dāng)我們?yōu)閼?yīng)用創(chuàng)建一個Models, 在同步到數(shù)據(jù)庫里,django默認給了三個權(quán)限 ,就是 add, change, delete權(quán)限。
首先,我們創(chuàng)建一個perm_test的project, 然后再創(chuàng)建一個school的app.
django-admin.py startproject perm_test cd perm_test python manage.py startapp schoolmodels:
from django.db import models# Create your models here.class Student(models.Model):name = models.CharField('姓名', max_length=64)age = models.SmallIntegerField('年齡')choices = ((1, '男'),(2, '女'),(3, '未知'))sex = models.SmallIntegerField('性別', choices=choices)admin.py
from django.contrib import admin# Register your models here. from . import modelsadmin.site.register(models.Student)同步到數(shù)據(jù)庫并創(chuàng)建superuser:
python manage.py makemigrations python manage.py migrate python manage.py createsuperuser啟動web服務(wù),登錄admin(http://localhost:8000)
python manage.py runserver在后臺先創(chuàng)建一個用戶試試, 看到選擇權(quán)限的地方如下:
先不加任何權(quán)限保存后,用新用戶登錄admin:
直接提示無權(quán)修改任何東西,因為沒有任何權(quán)限。
嘗試增加一個Student的change的權(quán)限,刷新一下:
只有修改的權(quán)限, 因為我們加的就是修改的權(quán)限, 但是這里好你有刪除選項,執(zhí)行試一下
無法顯示,顯然是沒有權(quán)限 刪除的
到django shell里查詢一下權(quán)限:
>>> python manage.py shell >>> from django.contrib.auth.models import User >>> user_obj = User.objects.get(name='lishi') #可以使用dir來看有哪些方法可以用 >>> dir(user_obj) #獲取用戶的所有權(quán)限 >>> user_obj.get_all_permissions() {'school.change_student'}以上這些都是django內(nèi)置的權(quán)限, 那我們怎么來定義自己的權(quán)限呢?
?
下面來定義自己的權(quán)限 并應(yīng)用在自己的頁面上呢?
首先要說的是,我們必須為url設(shè)置name, 因為權(quán)限需要和urlname配合使用,urlname就是url(r’’, views.method, name=’urlname’)里的name值。還要建立權(quán)限名稱和具體操作的映射關(guān)系, 即權(quán)限名稱與(urlname, 請求方法,參數(shù)列表)的對應(yīng)關(guān)系,如果用字典表示,就是這樣的:
{'add student', 'get', []}第一步,要在models中建立權(quán)限的名稱和描述信息,這個信息是在django admin中設(shè)置權(quán)限時顯示的信息
第二步,建立一個權(quán)限表Permission, 將權(quán)限的名稱,url名稱,請求方法(get or post), 參數(shù)列表保存進去
第三步, 定義判斷權(quán)限的方法
下面來實驗一下,我們定義一個查看學(xué)員列表的權(quán)限:
第一步: 在models中建立權(quán)限表,我是將映射關(guān)系存放在數(shù)據(jù)庫中:
class Permission(models.Model):name = models.CharField("權(quán)限名稱", max_length=64)url = models.CharField('URL名稱', max_length=255)chioces = ((1, 'GET'), (2, 'POST'))per_method = models.SmallIntegerField('請求方法', choices=chioces, default=1)argument_list = models.CharField('參數(shù)列表', max_length=255, help_text='多個參數(shù)之間用英文半角逗號隔開', blank=True, null=True)describe = models.CharField('描述', max_length=255)def __str__(self):return self.nameclass Meta:verbose_name = '權(quán)限表'verbose_name_plural = verbose_name#權(quán)限信息,這里定義的權(quán)限的名字,后面是描述信息,描述信息是在django admin中顯示權(quán)限用的permissions = (('views_student_list', '查看學(xué)員信息表'),('views_student_info', '查看學(xué)員詳細信息'),)第二步:在權(quán)限表中添加內(nèi)容,將對應(yīng)權(quán)限寫入數(shù)據(jù)庫:
?
第三步: 定義權(quán)限驗證方法, 邏輯是這樣,請求訪問學(xué)員列表, 先獲取url地址,根據(jù)url地址得到urlname, 再獲取請求方法和參數(shù),然后使用urlname, 請求方法,參數(shù)列表到數(shù)據(jù)庫中查詢,能查詢到之后說明這個權(quán)限存在;然后再使用request.user.has_perm()來判斷該用戶是否具有該權(quán)限。
在應(yīng)用school目錄下建立permission.py文件,我們將權(quán)限驗證方法寫在這里面:
from django.shortcuts import render from school import models from django.db.models import Q from django.core.urlresolvers import resolve #此方法可以將url地址轉(zhuǎn)換成url的namedef perm_check(request, *args, **kwargs):url_obj = resolve(request.path_info)url_name = url_obj.url_nameperm_name = ''#權(quán)限必須和urlname配合使得if url_name:#獲取請求方法,和請求參數(shù)url_method, url_args = request.method, request.GETurl_args_list = []#將各個參數(shù)的值用逗號隔開組成字符串,因為數(shù)據(jù)庫中是這樣存的for i in url_args:url_args_list.append(str(url_args[i]))url_args_list = ','.join(url_args_list)#操作數(shù)據(jù)庫get_perm = models.Permission.objects.filter(Q(url=url_name) and Q(per_method=url_method) and Q(argument_list=url_args_list))if get_perm:for i in get_perm:perm_name = i.nameperm_str = 'school.%s' % perm_nameif request.user.has_perm(perm_str):print('====》權(quán)限已匹配')return Trueelse:print('---->權(quán)限沒有匹配')return Falseelse:return Falseelse:return False #沒有權(quán)限設(shè)置,默認不放過def check_permission(fun): #定義一個裝飾器,在views中應(yīng)用def wapper(request, *args, **kwargs):if perm_check(request, *args, **kwargs): #調(diào)用上面的權(quán)限驗證方法return fun(request, *args, **kwargs)return render(request, '403.html', locals())return wapper到這里自定義權(quán)限已經(jīng)完成了,接下來要做的是在我們自己的頁面中使用:
創(chuàng)建一個student_list.html頁面,展示學(xué)員列表:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><table><tr><td>姓名</td><td>年齡</td><td>性別</td></tr>{% for student_obj in students_obj %}<tr><td>{{ student_obj.name }}</td><td>{{ student_obj.age }}</td><td>{{ student_obj.get_sex_display }}</td></tr>{% endfor %}</table> </body> </html>創(chuàng)建views方法:
from django.shortcuts import render from school import models from school.permission import check_permission # Create your views here. @check_permission def students(request):students_obj = models.Student.objects.all()return render(request, 'students_list.html', locals())我們使用裝飾器的方法來檢查權(quán)限。當(dāng)用戶具有權(quán)限時,返回渲染的頁面。但似乎還少了點什么,在權(quán)限驗證方法里,當(dāng)檢測沒有權(quán)限時返加403頁面,所以我們還要創(chuàng)建一個403頁面403.html:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><h1>403</h1><h2>You don't have enought permissions to this action!</h2> </body> </html>最后建立urls.py吧:
project下的urls.py:
from django.conf.urls import url, include from django.contrib import adminurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^school/', include('school.urls')), ]school下的urls.py:
from django.conf.urls import url from school import viewsurlpatterns = [url(r'students/$', views.students, name='students_list'), ]到這算是完全寫好了,下面來驗證一下:
登錄admin設(shè)置一下lishi的權(quán)限,我們先不給任何權(quán)限,訪問http://localhost:8000/school/students看看結(jié)果:
訪問結(jié)果, 是我們想要的結(jié)果,提示沒有權(quán)限:
再給lishi一個查看的權(quán)限:
再來訪問一下:
到此為止吧.
轉(zhuǎn)載于:https://www.cnblogs.com/huangxm/p/5770735.html
總結(jié)
以上是生活随笔為你收集整理的django权限管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UE4笔记-进程/线程/网络/IO模块的
- 下一篇: TCP和UDP的聊天