2020-12-14 drf-jwtRBAC,xadmin,緩存妓湘,信號

昨日回顧

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)建就寫入日志)
    -解耦合
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吆豹,一起剝皮案震驚了整個濱河市鱼的,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痘煤,老刑警劉巖凑阶,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衷快,居然都是意外死亡宙橱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門蘸拔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來师郑,“玉大人,你說我怎么就攤上這事调窍”γ幔” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵邓萨,是天一觀的道長地梨。 經(jīng)常有香客問我,道長缔恳,這世上最難降的妖魔是什么宝剖? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮歉甚,結(jié)果婚禮上万细,老公的妹妹穿的比我還像新娘。我一直安慰自己纸泄,他們只是感情好赖钞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刃滓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耸弄。 梳的紋絲不亂的頭發(fā)上咧虎,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機(jī)與錄音计呈,去河邊找鬼砰诵。 笑死征唬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茁彭。 我是一名探鬼主播总寒,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼理肺!你這毒婦竟也來了摄闸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤妹萨,失蹤者是張志新(化名)和其女友劉穎年枕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乎完,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熏兄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了树姨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摩桶。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖帽揪,靈堂內(nèi)的尸體忽然破棺而出硝清,到底是詐尸還是另有隱情,我是刑警寧澤台丛,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布耍缴,位于F島的核電站,受9級特大地震影響挽霉,放射性物質(zhì)發(fā)生泄漏防嗡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一侠坎、第九天 我趴在偏房一處隱蔽的房頂上張望蚁趁。 院中可真熱鬧,春花似錦实胸、人聲如沸他嫡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钢属。三九已至,卻和暖如春门躯,著一層夾襖步出監(jiān)牢的瞬間淆党,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留染乌,地道東北人山孔。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像荷憋,于是被迫代替她去往敵國和親台颠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容