您好,登錄后才能下訂單哦!
本篇文章為大家展示了Django web中怎么自定義通用權(quán)限,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
需求:web系統(tǒng)有包含以下5個(gè)url,分別對(duì)于不同資源;
1、stu/add_stu/
2、stu/upload_homework/
3、stu/query_homework/
4、stu/add_record/
--------------------------------------------------------------------------------------------------------
學(xué)生可以訪問:2,3
老師可以訪問:1,4
可以通過(guò)基于角色對(duì)用戶權(quán)限進(jìn)行控制:
一、數(shù)據(jù)模型
1、用戶表:用戶表和角色表為多對(duì)多關(guān)系,1個(gè)用戶可以有多個(gè)角色,1個(gè)角色可以被多個(gè)用戶劃分;
email = models.EmailField( verbose_name='email address', max_length=255, unique=True, ) password = models.CharField(_('password'),max_length=128,\ help_text=mark_safe('''<a href ="password/" >修改密碼</a>''')) name = models.CharField(max_length=32,help_text='用戶登陸后請(qǐng)修改為真實(shí)名字') is_active = models.BooleanField(default=True) is_admin = models.BooleanField(default=False) role = models.ManyToManyField("Role") def __str__(self): return self.email
2、角色表:
class Role(models.Model): """角色表""" name = models.CharField(unique=True,max_length=32) menus = models.ManyToManyField("Menu") def __str__(self): return self.name
3、菜單表:
class Menu(models.Model): """動(dòng)態(tài)菜單""" name = models.CharField(unique=True,max_length=32) url_type = models.SmallIntegerField(choices=((0,'relative_name'),(1,'absolute_url'))) url_name = models.CharField(unique=True,max_length=128) def __str__(self): return self.name
二、前端根據(jù)用戶權(quán)限生成菜單
<div class="container-fluid"> <div class="row"> {% block side-bar %} <div class="col-sm-3 col-md-2 sidebar"> <ul class="nav nav-sidebar"> {% block side-bar-menus %} {% for role in request.user.userprofile.roles.all %} <hr> {% for menu in role.menus.all %} <li> <a href="{% if menu.url_type == 0 %}{% url menu.url_name %}{% else %} {{ menu.url_name }}{% endif %}" rel="external nofollow" > {{ menu.name }} </a> </li> {% endfor %} {% endfor %} {% endblock %} </ul> </div> {% endblock %}
這樣就可以根據(jù)用戶生成菜單,但是如果用戶不是通過(guò)菜單方法,而是直接通過(guò)url訪問,后臺(tái)還是沒有對(duì)這些url進(jìn)行控制
三、后臺(tái)根據(jù)用戶權(quán)限控制菜單訪問
裝飾器:
簡(jiǎn)言之,python裝飾器就是用于拓展原來(lái)函數(shù)功能的一種函數(shù),這個(gè)函數(shù)的特殊之處在于它的返回值也是一個(gè)函數(shù),使用python裝飾器的好處就是在不用更改原函數(shù)的代碼前提下給函數(shù)增加新的功能。
class Mddile1(MiddlewareMixin): def process_request(self,request): #如果用戶訪問的url是登錄、注冊(cè)頁(yè)面,記錄到白名單,放行 for url in settings.PASS_URL_LIST: if re.match(url,request.path_info): return None Permission_url_list=request.session.get(settings.SESSION_PERMISSION_URL_KEY) #如果用戶訪問的url 不在當(dāng)前用戶權(quán)限之內(nèi) 返回login頁(yè)面 if not Permission_url_list: return redirect(settings.LOGIN_URL) current_url=request.path_info #由于數(shù)據(jù)庫(kù)的數(shù)據(jù),可能是正則所有 一定要精確匹配 flag=False for url in Permission_url_list: url='^%s$'%(url) if re.match(url,current_url): flag=True break if not flag: if settings.DEBUG: #如果是程序調(diào)試應(yīng)該 顯示用戶可以訪問的權(quán)限 url_html='<br/>'.join(Permission_url_list) return HttpResponse('無(wú)權(quán)訪問您可以訪問%s'%url_html) else: return HttpResponse('沒有權(quán)限')
上述內(nèi)容就是Django web中怎么自定義通用權(quán)限,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。