昨日回顧
1查蓉、基于jwt的多方式登錄
-login
-之前寫的處理邏輯都是在視圖類中
-這次把邏輯拿到序列化類中validate方法中,在視圖函數(shù)中不用寫邏輯多柑,執(zhí)行了is_valide,就會把數(shù)據(jù)傳到validate這進(jìn)行校驗奶是,都通過后,就會返回到序列化對象的data中
-重點(diǎn):視圖類和序列化類之間交互數(shù)據(jù)的橋梁竣灌,context={}聂沙,是在校驗通過之后的交互才可以
2、自定義用戶表初嘹,登錄及汉,手動簽發(fā)token,自己定義的認(rèn)證類
-認(rèn)證哦通過屯烦,正常情況下查詢得到當(dāng)前登錄用戶(訪問數(shù)據(jù)庫)坷随,但是咱們處于效率的考慮沒有查詢數(shù)據(jù)房铭,自己構(gòu)造了一個user對象,就是在認(rèn)證通過后温眉,解析出payload荷載
直接講荷載等于user缸匪,返回到視圖類,就可以在request.user里取到字典类溢,里面有user_id,根據(jù)這個就可以取到用戶對象和具體字段信息凌蔬。
3、jwt中重要的
-幾個函數(shù):
-payload = jwt_decode_handler(token) # 解碼過程
-payload = jwt_payload_handler(user) # 加碼的過程
-token = jwt_encode_handler(payload) # 通過payload得到
-token
-配置文件:
-token過期時間
4闯冷、book的多表增刪查改砂心,群增,群刪蛇耀,群查辩诞,群改
-群查,單查
-單增纺涤,群增:序列化類译暂,初始化的時候,指定many=True撩炊,得到的是ListSerializer對象
-單扇秧秉,群刪:合二為一
-單改,群改:
群改兩種方法:
-自行for循環(huán)
-many=True衰抑,重寫ListBookSerializer,繼承ListSerializer荧嵌,重寫update方法
指定many=True的時候呛踊,就生成ListBookSerializer的對象了
BookSerializer要跟ListBookSerializer建立聯(lián)系
list_serializer_class=ListBookSerializer,這樣群增的時候才會導(dǎo)到ListBookSerializer執(zhí)行
今日內(nèi)容
1啦撮、RBAC-基于角色的訪問控制
RBAC:是基于角色的訪問控制(Role-Based Access Control)
在RBAC中谭网,權(quán)限于角色相關(guān)聯(lián),用戶通過成為適當(dāng)角色的成員而得到這些角色的權(quán)限赃春,這就極大的簡化了權(quán)限的管理愉择,這樣管理都是層級相互依賴的,權(quán)限賦予給角色织中,
而把角色又賦予給用戶锥涕,這樣的權(quán)限設(shè)計很清楚,管理起來很方便狭吼。
# 后臺管理(公司內(nèi)部系統(tǒng)):使用RBAC层坠,基于角色的訪問控制,就是控制后臺管理中的人員的權(quán)限設(shè)置
# 前臺(主站)的權(quán)限管理:權(quán)限刁笙,頻率破花,認(rèn)證谦趣,來控制,用戶所能看到的東西叫前臺或者主站
# rbac的表設(shè)計
# 最初3張表
用戶表 角色表 權(quán)限表
# 5張表
用戶表 角色表 權(quán)限
用戶表和角色表是多對多座每,需要建立第三張表
角色和權(quán)限是多對多前鹅,需要建立第三張表
#6張表
用戶表 角色表 權(quán)限表
用戶表和角色表是多對多,需要建立第三張表
角色和權(quán)限是多對多峭梳,需要建立第三張表
用戶和權(quán)限多對多舰绘,建立第三張表
# django內(nèi)置了rbac的6張表
auth_user:用戶表
auth_group:角色(組)表
auth_permission:權(quán)限表
auth_user_group:用戶對角色的中間表
auth_group_permission:角色對權(quán)限的中間表
auth_user_user_permission:用戶地權(quán)限的中間表
# 結(jié)論:沒有特殊要求的django項目可以直接采用auth組件的權(quán)限6表,不需要自定義六個表延赌,也不需要斷開表關(guān)系除盏,但可能需要自定義user表
2、xadmin的使用
-1挫以、django內(nèi)置了一個admin者蠕,有的人覺得丑,功能不夠強(qiáng)大掐松,這群人寫了個叫xadmin的玩意踱侣,用來替換admin
-2、django的一個app
-3大磺、如何使用
-區(qū)分1.x和2.x
-1.x:pip3 install xadmin
-2.x:pip3 install git+git://github.com/sshwsfc/xadmin.git@django2
pip3 install https://codeload.github.com/sshwsfc/xadmin/zip/django2
-django2.x+xadmin 2.x 環(huán)境搭建
-安裝
-在app中注冊
'xadmin',
'crispy_forms',
'reversion',
-修改國際化
# 修改使用中文界面
LANGUAGE_CODE = 'zh-Hans'
# 修改時區(qū)
TIME_ZONE = 'Asia/Shanghai'
-數(shù)據(jù)遷移
python3 manage.py makemigrations
python3 manage.py migrate
-配置路由信息
import xadmin
xadmin.autodiscover()
# version模塊自動注冊需要版本控制的 Model
from xadmin.plugins import xversion
xversion.register_models()
urlpatterns = [
path('xadmin/', xadmin.site.urls)
]
-創(chuàng)建超級用戶
python manage.py createsuperuser
-登錄抡句,訪問地址,輸入用戶名密碼進(jìn)入
http://127.0.0.1:8000/xadmin/
-4杠愧、美化
-在app中的admin.py中寫一個類
import xadmin
from xadmin import views
from app01 import models
class BaseSetting():
"""xadmin的基本配置"""
enable_themes = True # 開啟主題切換功能
use_bootswatch = True
class GlobalSettings():
"""xadmin的全局配置"""
site_title = "路飛學(xué)城" # 設(shè)置站點(diǎn)標(biāo)題
site_footer = "路飛學(xué)城有限公司" # 設(shè)置站點(diǎn)的頁腳
# menu_style = "accordion" # 設(shè)置菜單折疊
# 注冊一下美化類
xadmin.site.register(views.BaseAdminView, BaseSetting)
xadmin.site.register(views.CommAdminView, GlobalSettings)
class BookClass():
# 該表展示的字段
list_display = ['id', 'name', 'price','publish']
# 按照這些字段搜索
search_fields = ['id','name']
# 按哪些字段過濾
list_filter = ['is_delete']
# 可以把數(shù)據(jù)導(dǎo)出成excel待榔,json,xml格式
list_export = ('xls', 'xml', 'json')
# list_export設(shè)置為None來禁用數(shù)據(jù)導(dǎo)出功能
list_export_fields = ('id', 'name', 'price') # 沒啥用
#data_charts 控制顯示圖表的樣式
data_charts = {
"order_amount": {
'title': '圖書價格表',
"x-field": "id",
"y-field": ('price',),
"order": ('id',)
},
}
-表注冊流济,以及美化類注冊
xadmin.site.register(models.Book,BookClass)
xadmin.site.register(models.Publish)
xadmin.site.register(models.AuthorDetail)
xadmin.site.register(models.Author)
3锐锣、django緩存
緩存介紹:
在動態(tài)網(wǎng)站中,用戶所有請求绳瘟,服務(wù)器都會去數(shù)據(jù)庫進(jìn)行相應(yīng)的增刪查改雕憔,渲染模板,執(zhí)行業(yè)務(wù)邏輯糖声,最后生成用戶看到的頁面斤彼。
當(dāng)一個網(wǎng)站的用戶訪問量很大的時候,每一次的后臺操作蘸泻,都會消耗很多的服務(wù)端資源琉苇,所以必須是用緩存來減輕后端服務(wù)器的壓力。
緩存時將一些常用的數(shù)據(jù)保存在內(nèi)存或者memcache中悦施,在一定的時間內(nèi)有人來訪問這些數(shù)據(jù)時翁潘,則不再去執(zhí)行數(shù)據(jù)庫及渲染等操作,而是直接從內(nèi)存或者memcache的緩存
中去取得數(shù)據(jù)歼争,然后返回給用戶拜马。
3.1 緩存位置
-1渗勘、內(nèi)存中
-2、文件中(硬盤上)
-3俩莽、數(shù)據(jù)庫緩存
-4旺坠、redis中(后期都用它)
-5、通過配置扮超,設(shè)置緩存位置
-以文件緩存為例
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定緩存使用的引擎
'LOCATION': '/var/tmp/django_cache', #指定緩存的路徑
'TIMEOUT':300, #緩存超時時間(默認(rèn)為300秒,None表示永不過期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大緩存記錄的數(shù)量(默認(rèn)300)
'CULL_FREQUENCY': 3, # 緩存到達(dá)最大個數(shù)之后取刃,剔除緩存?zhèn)€數(shù)的比例,即:1/CULL_FREQUENCY(默認(rèn)3)
}
}
}
3.2 緩存粒度
-1出刷、三種粒度:整站緩存璧疗,單頁面緩存,局部緩存
-2馁龟、單頁面緩存
#單頁面緩存裝飾器
from django.views.decorators.cache import cache_page
@cache_page(5)
def index(request):
import time
ctime=time.time()
return render(request,'index.html',context={'ctime':ctime})
-3崩侠、頁面中某個位置緩存(局部緩存)一般不和其他緩存同時使用,如果同時使用坷檩,越往后級別越高却音,后面的設(shè)置緩存時間控制力強(qiáng)
# 緩存3s鐘。xxx唯一key矢炼,唯一的
{% load cache %}
{% cache 3 'xxx'%}
這一部分用緩存
時間為:{{ ctime }}
{% endcache %}
-4系瓢、整站緩存(兩個中間件)
# 在setting中配置
from django.middleware.cache import UpdateCacheMiddleware # 可以這樣導(dǎo)入來看源碼, 這就是重寫了process_response方法
‘django.middleware.cache.UpdateCacheMiddleware’, #第一,重寫了process_response
'............',
‘django.middleware.cache.FetchFromCacheMiddleware’, #最后句灌,重寫了process_requset
# 緩存過期時間
CACHE_MIDDLEWARE_SECONDS=5
3.3夷陋、前后端分離后緩存使用
-1、查出一堆json格式數(shù)據(jù)胰锌,連表查了8個表
-2肌稻、前后端分離后
-只需要會如何把字典,字符串匕荸,對象放到緩存中,
-如何取出來
-3枷邪、具體使用榛搔,代碼如下
from django.core.cache import cache
class BookView(APIView):
def get(self, request):
res_data = cache.get('book_list_dix',)
if res_data: # 有緩存,直接返回
print('走了緩存')
return Response(res_data)
else: # 沒有緩存东揣,再走數(shù)據(jù)庫
book_list = models.Book.objects.all()
ser = serializer.BookSer(book_list, many=True)
# 想把ser.data緩存起來
cache.set('book_list_dix', ser.data,100)# 參數(shù)分別是緩存的key践惑,要緩存的數(shù)據(jù),過期時間嘶卧,注意不要和其他緩存想沖了尔觉,一般不同時使用。
print('沒走緩存')
return Response(ser.data)
-4芥吟、cache可以緩存所有數(shù)據(jù)類型侦铜,包括自定義的類专甩,用的就是pickle方法
4、django信號
信號簡介
django提供一種信號機(jī)制钉稍,其實(shí)就是觀察者模式涤躲,通俗來講,就是一些動作發(fā)生的時候贡未,信號允許特定的發(fā)送者去提醒一些接受者种樱,用于在框架執(zhí)行操作時解耦。
-1俊卤、django提供一種信號機(jī)制嫩挤,發(fā)生一些動作的時候,發(fā)出信號消恍,然后監(jiān)聽了這個信號的函數(shù)就會執(zhí)行
-2岂昭、django內(nèi)置信號
Model signals
pre_init # django的modal執(zhí)行其構(gòu)造方法前,自動觸發(fā)
post_init # django的modal執(zhí)行其構(gòu)造方法后哺哼,自動觸發(fā)
pre_save # django的modal對象保存前佩抹,自動觸發(fā)
post_save # django的modal對象保存后,自動觸發(fā)
pre_delete # django的modal對象刪除前取董,自動觸發(fā)
post_delete # django的modal對象刪除后棍苹,自動觸發(fā)
m2m_changed # django的modal中使用m2m字段操作第三張表(add,remove,clear)前后,自動觸發(fā)
class_prepared # 程序啟動時茵汰,檢測已注冊的app中modal類枢里,對于每一個類,自動觸發(fā)
Management signals
pre_migrate # 執(zhí)行migrate命令前蹂午,自動觸發(fā)
post_migrate # 執(zhí)行migrate命令后栏豺,自動觸發(fā)
Request/response signals
request_started # 請求到來前,自動觸發(fā)
request_finished # 請求結(jié)束后豆胸,自動觸發(fā)
got_request_exception # 請求異常后奥洼,自動觸發(fā)
Test signals
setting_changed # 使用test測試修改配置文件時,自動觸發(fā)
template_rendered # 使用test測試渲染模板時晚胡,自動觸發(fā)
Database Wrappers
connection_created # 創(chuàng)建數(shù)據(jù)庫連接時灵奖,自動觸發(fā)
-3、內(nèi)置信號的使用(兩種方式)
# 在app里的__init__.py中寫代碼
對于django內(nèi)置的信號估盘,僅需組測指定的信號瓷患,當(dāng)程序執(zhí)行相應(yīng)操作時,自動觸發(fā)注冊函數(shù)執(zhí)行
#方式一
#1遣妥、 導(dǎo)入內(nèi)置信號
from django.core.signals import request_started
#2擅编、寫一個函數(shù)
def aa(sender,**kwargs):
print(sender) # <class 'django.core.handlers.wsgi.WSGIHandler'>
print(kwargs) # 是一個字典,又很多東西
print('請求來了,我寫日志了爱态。谭贪。。')
#3肢藐、跟內(nèi)置信號綁定
request_started.connect(aa)
# 方式二
from django.core.signals import request_started,request_finished
from django.dispatch import receiver
@receiver(request_finished) # 內(nèi)置信號pre_save和my_callback函數(shù)綁定了
def my_callback(sender, **kwargs):
print("請zzou了故河,走了我")
-4、信號的應(yīng)用場景
-記錄日志(對象創(chuàng)建就寫入日志)
-解耦合