內容回顧:html
1.使用別人源碼,啓動:解釋器+工做目錄
2. django請求生命週期
3. 配置文件
- key必須大寫
- 導入配置
from django.conf import settings
3. 在模板中定義函數
- sample_tag
- inclusion_tag
4. 尋找模板的順序(靜態文件)
- 最外層templates目錄 (static)
- 去註冊的app下的templates目錄中找(按照app註冊順序)(static)
5. auto示例:全部用戶登陸後看到的菜單都同樣。python
今日內容:
1. 菜單+權限信息=> 數據庫
2. 權限組件的應用(含菜單)
3. crm業務
內容詳細:
1. 菜單+權限信息=> 數據庫
a. 數據庫設計
from django.db import modelsweb
class Menu(models.Model):
"""
菜單表
"""
title = models.CharField(verbose_name='標題',max_length=32)
icon = models.CharField(verbose_name='圖標',max_length=32)數據庫
class Permission(models.Model):
"""
權限表
"""
url = models.CharField(verbose_name='URL(含正則)', max_length=128)
title = models.CharField(verbose_name='名稱',max_length=32)
name = models.CharField(verbose_name='別名',max_length=32,unique=True)django
menu = models.ForeignKey(verbose_name='管理菜單',to='Menu',to_field='id',null=True,blank=True)
parent = models.ForeignKey(verbose_name='父菜單',to='Permission',null=True,blank=True)
class Role(models.Model):
"""
角色表
"""
title = models.CharField(verbose_name='名稱', max_length=32)
permissions = models.ManyToManyField(verbose_name='關聯權限',to='Permission')
class UserInfo(models.Model):
"""
用戶表
"""
username = models.CharField(verbose_name='用戶名',max_length=32)
password = models.CharField(verbose_name='密碼',max_length=64)
roles = models.ManyToManyField(verbose_name='關聯角色',to='Role')
b. 數據填充
c. 上一節功能去掉
- 去掉web app
- url.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
# url(r'^web/', include('web.urls')),
]
- settings.py
去掉 MENU_LIST
去掉註冊的app: 'web.apps.WebConfig',
d. 獲取權限和菜單信息
用戶登陸:馬帥,UserInfo表中作查詢,登陸成功後獲取兩部分數據:
權限 = {
"user": {"url":'/app01/user/'},
"user_add": {"url":'/app01/user/add/'},
"user_edit": {"url":'/app01/user/edit/(\d+)'},
"order": {"url":'/app01/order/'},
}
菜單信息 = {
1:{
'title':'用戶管理',
'icon':'fa-clipboard',
'children':[
{'title':'用戶列表','url':'/app01/user/'},
]
},
2:{
'title':'商品管理',
'icon':'fa-clipboard',
'children':[
{'title':'訂單列表','url':'/app01/order/'},
]
}
}
e. 權限控制
f. 動態生成二級菜單
g. 粒度控制到按鈕級別
- 權限別名
- filter
2. 使用權限系統
1. 拷貝rbac應用
2. 刪除rbac/migrations目錄中除 __init__.py 之外的全部文件
3. 配置文件中註冊 rbac的app
INSTALLED_APPS = [
...
'rbac.apps.RbacConfig',
]
4. 數據庫遷移
python manage.py makemigrations
python manage.py migrate
5. 編寫測試系統的業務邏輯
若是使用rbac中的模板的話,須要先刪除layout.html中的:
<!-- 導入xxxxxxx模塊 -->
{% load rbac %}
<!-- 執行get_menu函數並傳遞了一個參數 -->
{% get_menu request %}
業務邏輯開發完畢....
6. 設置權限相關的配置文件
# ############################ 權限+菜單相關配置 #############################
RBAC_PERMISSION_SESSION_KEY = "ijksdufwesdfs"
RBAC_MENU_SESSION_KEY = "rtwsdfgwerffsd"api
VALID_LIST = [
'/api/login/',
'/admin/.*'
]
7. 基於django admin 錄入權限數據
- 菜單
- 權限
- 權限角色關係表
- 角色
- 用戶角色關係表
- 用戶
8. 權限和菜單信息的應用
- 用戶登陸:初始化權限和菜單信息
def login(request):
"""
用戶登陸
:param request:
:return:
"""
if request.method == "GET":
return render(request, 'api/login.html')
user = request.POST.get('user')
pwd = request.POST.get('pwd')
user = rbac_model.UserInfo.objects.filter(username=user, password=pwd).first()
if not user:
return render(request, 'api/login.html', {'msg': '用戶名或密碼錯誤'})
# ############ 看這裏 ############
init_permission(user, request)
return redirect('/api/app/list/')
- 中間件:權限判斷
settings.py
MIDDLEWARE = [
...
'rbac.middlewares.rbac.RBACMiddleware',
]
- inclusion_tag:動態生成菜單
layout.html
<div class="menu-body">
{% load rbac %}數據結構
{% get_menu request %}
</div>
9. 控制頁面按鈕
{% extends 'layout.html' %}
{% load rbac %} app
{% block content %}
<h1>應用列表</h1>
{% if 'app_add'|permission:request %}
<a class="btn btn-primary" href="{% url 'app_add' %}">添加</a>
{% endif %}
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
{% if "app_edit"|permission:request or "app_del"|permission:request %}
<th>操做</th>
{% endif %}
</tr>
</thead>
<tbody>
{% for row in app_queryset %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.title }}</td>
{% if "app_edit"|permission:request or "app_del"|permission:request %}
<td>
{% if "app_edit"|permission:request %}
<a href="{% url 'app_edit' row.id %}">編輯</a>
{% endif %}
{% if "app_del"|permission:request %}
<a href="{% url 'app_del' row.id %}/">刪除</a>
{% endif %}
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>數據庫設計
{% endblock %}
總結:
1. 保存的代碼:
- 上一節示例:auto - 7 - 靜態的菜單示例(最終版).zip
- 本節示例:nb_test.zip
2. 權限相關
1. 權限系統是如何實現的?
基於角色的權限控制(rbac)
2. 權限系統中用了哪些表?表中都有哪些字段?
3. 你用中間件實現過什麼?爲何使用中間件?
rbac對權限的控制。
4. 你認爲哪裏最難搞?
- 動態二級菜單+默認選中
- 構建菜單和權限的數據結構時。
5. 其餘
...
做業:補充 nb_test 應用。
- 8個api操做(使用ModelForm實現增刪改查)
url(r'^app/list/$', views.app_list,name='app_list'),
url(r'^app/add/$', views.app_add,name='app_add'),
url(r'^app/edit/(\d+)/$', views.app_edit,name='app_edit'),
url(r'^app/del/(\d+)/$', views.app_del,name='app_del'),
url(r'^api/list/$', views.api_list,name='api_list'),
url(r'^api/add/$', views.api_add,name='api_add'),
url(r'^api/edit/(\d+)/$', views.api_edit,name='api_edit'),
url(r'^api/del/(\d+)/$', views.api_del,name='api_del'),
- 9 + api
在api列表中設置一個按鈕,點擊測試。
"""
pip3 install requests
"""
import requests
response = requests.get(url='http://www.baidu.com')
print(response.status_code)
print(response.text)
總結:
一、layout.html在外層,項目會先找外層的,外層沒有會按照app的註冊順序找裏層的。
函數