1. 程式人生 > 其它 >Django(十一)

Django(十一)

django操作cookie和session

        # session的預設過期時間是14天

        '''在負載均衡中,如果使用session儲存使用者資訊,會出現session共享問題?'''
        那麼, 如何解決上述問題?

        常用的快取資料庫就是redis

        '''
            1. 快取雪崩
            2. 快取穿透
            3. 快取擊穿
        '''
        '''在settings.py中配置'''

        SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie儲存在瀏覽器上時的key,即:sessionid=隨機字串(預設)
        SESSION_COOKIE_PATH = "/"                               # Session的cookie儲存的路徑(預設)
        SESSION_COOKIE_DOMAIN = None                             # Session的cookie儲存的域名(預設)
        SESSION_COOKIE_SECURE = False                            # 是否Https傳輸cookie(預設)
        SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支援http傳輸(預設)
        SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(預設)
        SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否關閉瀏覽器使得Session過期(預設)
        SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次請求都儲存Session,預設修改之後才儲存(預設)

CBV新增裝飾器

        from django.views import View
        from django.utils.decorators import method_decorator


        @method_decorator(login_auth, 'get')  # 第二種方式新增
        @method_decorator(login_auth, 'post')
        class IndexView(View):
            @method_decorator(login_auth)  # 第三張方式給所有的方法新增裝飾器
            def dispatch(self, request, *args, **kwargs):
                return super().dispatch(request, *args, **kwargs)

            # @method_decorator(login_auth)  # 第一種方式新增裝飾器
            def get(self, request):
                return HttpResponse('get')

            def post(self, request):
                return HttpResponse('post')

中介軟體

        django給我們提供了7箇中間件,在配置檔案中查詢
        MIDDLEWARE = [
            'django.middleware.security.SecurityMiddleware',
            'django.contrib.sessions.middleware.SessionMiddleware',
            'django.middleware.common.CommonMiddleware',
            # 'django.middleware.csrf.CsrfViewMiddleware',
            'django.contrib.auth.middleware.AuthenticationMiddleware',
            'django.contrib.messages.middleware.MessageMiddleware',
            'django.middleware.clickjacking.XFrameOptionsMiddleware',
        ]

        # 還支援我們自定義中介軟體
        '''
            中介軟體用來幹嘛:
                1. 校驗許可權
                2. 限制訪問頻率
                3. 檢查認證
                ...
        '''

        步驟:
            1. 在任何一個應用下面,建立一個py檔案
            2. 在py檔案中寫一個類必須要繼承MiddlewareMixin
            3. 中間寫完之後,一定要到配置檔案中註冊中介軟體

        需要我們掌握的
            '''
                1. process_request
                    請求來的時候會走
                2. process_response
                    請求走的時候會走
            '''
        from django.shortcuts import render, HttpResponse
        from django.utils.deprecation import MiddlewareMixin


        class Mydd1(MiddlewareMixin):
            def process_request(self, request):
                print('第一個process_request')
                return HttpResponse('第一個process_request')

            def process_response(self, request, response):
                print('第一個process_response')
                return response  # 必須要返回一個response物件


        class Mydd2(MiddlewareMixin):
            def process_request(self, request):
                print('第二個process_request')

            def process_response(self, request, response):
                print('第二個process_response')
                return response  # 必須要返回一個response物件

csrf跨站請求

        # 背景:
            釣魚網站
             '''
                英語4級報名網站為例
                    你要在這個網站要付費,你去的這個網站是一個冒牌的網站,他就去冒牌網站裡面付費了,前付到了冒牌網站,沒有報名成功。

             '''
          他會出現在form表單中,action引數:朝後端傳送的地址

        # 怎麼解決這個問題?

        # csrf是針對與post請求的才會做驗證

        '''token相關的,一般都是一個串,祕鑰, 私鑰,公鑰'''

        # 兩種解決方式

         {#data:{'a':1, 'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()},#}
        data:{'a':1, 'csrfmiddlewaretoken': '{{ csrf_token }}'},

csrf相關裝飾器

        '''
            如果使用中介軟體限制的話,他就會限制全域性的,要麼全部限制,要麼全部不限制

            只有index函式需要驗證,其他的不需要驗證
            我只想讓home函式不驗證,其他的都需要驗證
        '''
        提供了2個裝飾器
        csrf_protect: 需要驗證
        csrf_exempt:不需要驗證

        '''
            按照FBV和CBV的使用即可
        '''

        from django.views.decorators.csrf import csrf_exempt,csrf_protect
        '''
            針對CBV:
                csrf_protect的三種方式都是可以的
                csrf_exempt前兩種方式都不行,只有第三種方式可以的
        '''

Auth模組

        # 遷移資料庫會有一個表生成,auth_user
        # django專案建立完後之後,會有一個預設的路由,admin/
        # admin/是django預設提供的後臺管理介面

        訪問admin/登入參照的資料就是從auth_user表中來,前提是必須是超級管理員

        # 如何建立超級管理員?

        python3 manage.py createsuperuser