django進階版3

hello...python

cookie與session
        爲何會有cookie和session?
            因爲http協議是無狀態的 沒法記住用戶是誰
        cookie
            cookie是保存在客戶端瀏覽器上的鍵值對
            
            是服務端設置在客戶端瀏覽器上的鍵值對
            也就意味着瀏覽器其實能夠拒絕服務端的"命令"
            默認狀況下 瀏覽器都是直接讓服務端設置鍵值對
        
        django必會三板斧
            return HttpResponse()
            return render()
            return redirect()
            
            變形:
            obj1 = HttpResponse()
            return obj1
            obj2 = render()
            return obj2
            obj3 = redirect()
            return obj3
            
            
            設置cookie
                obj1.set_cookie()
            獲取
                request.COOKIES.get()
            刪除
                obj1.delete_cookie()
            
            1.登陸功能
                用戶登陸成功以後 必定要保存用戶狀態
                
            
        
        
        session
            session是保存在服務器上的鍵值對
            
            django session默認的過時時間是14天
            
            
            操做session
            
            設置session
                request.session['key'] = value  # 僅僅只會在內存產生一個緩存
                """
                1.django內部自動生成了隨機的字符串
                2.在django_session表中存入數據
                    session_key          session_data         date
                    隨機字符串1              數據1            ...
                    隨機字符串2              數據2            ...
                    隨機字符串3              數據3            ...
                3.將產生的隨機字符串發送給瀏覽器 讓瀏覽器保存到cookie中
                    sessionid:隨機字符串

                """  
            獲取session
                request.session.get('key')
                """
                1.瀏覽器發送cookie到django後端以後 django會自動獲取到cookie值
                2.拿着隨機字符串去django_session表中比對 是否有對應的數據
                3.若是比對上了 就講隨機字符串所對應的數據 取出賦值給request.session
                   若是對不上 那麼request.session就是個空
                   
                """
                
                
            django session表是針對瀏覽器的
            不一樣的瀏覽器來 纔會有不一樣的記錄
            
            
            
            刪除session
                request.session.delete()  # 只刪除服務端的session
                
                request.session.flush()  # 瀏覽器和服務端所有刪除

            
            session也能夠設置超時時間
                request.session.set_expiry(value多種配置)
                    
                    數字
                    0 
                    不寫
                    時間格式
                    
                    
                    
        做業:用session作登陸校驗
        
    
    django中間件(******)
        用戶訪問頻率限制
        用戶是不是黑名單 白名單
        全部用戶登陸校驗
        只要是涉及到網址全局的功能 你就應該考慮使用中間件
        
        
        django中間件暴露給程序員五個能夠自定義的方法(五個方法都是在特定的條件下自動觸發的)
            1.新建一個文件夾 裏面新建一個任意名稱的py文件
            裏面寫類 固定繼承
            from django.utils.deprecation import MiddlewareMixin
            class MyMiddle(MiddlewareMixin):
                ...
            2.去配置文件註冊到中間件配置中
                你須要手寫字符串的路徑
                 'app01.mymiddleware.myaabb.MyMiddle1'
        
        
            須要掌握的
                process_request(******):請求來的時候 會從上往下依次通過每個中間件裏面process_request,一旦裏面返回了HttpResponse對象那麼就再也不日後執行了 會執行同一級別的process_response
                        def process_request(self,request):
                            print('我是第一個自定義中間件裏面的process_request方法')
                            return HttpResponse("我是第一個自定義中間件裏面的HttpResponse對象返回值")  # 直接原地返回
                process_response(***):響應走的時候 會從下往上依次進過每個中間件裏面的process_response
                        def process_response(self,request,response):  # response就是要返回給用戶的數據
                            print("我是第一個自定義中間件裏面的process_response方法")
                            return response
            瞭解的
                process_view:路由匹配成功以後執行視圖函數以前觸發
                process_exception:當視圖函數出現異常(bug)的時候自動觸發
                process_template_response:當視圖函數執行完畢以後而且返回的對象中含有render方法的狀況下才會觸發

    
    跨站請求僞造(csrf)      釣魚網站
        就相似於你搭建了一個跟銀行如出一轍的web頁面
        用戶在你的網站轉帳的時候輸入用戶名 密碼 對方帳戶
        銀行裏面的錢確實少了 可是發現收款人變了
        
        
        最簡單的原理
            你寫的form表單中 用戶的用戶名  密碼都會真實的提交給銀行後臺
            可是收款人的帳戶卻不是用戶填的 你暴露給用戶的是一個沒有name屬性的input框
            你本身提早寫好了一個隱藏的帶有name和value的input框
            
            
    解決釣魚網站的策略
        只要是用戶想要提交post請求的頁面 我在返回給用戶的時候就提早設置好一個隨機字符串
        當用戶提交post請求的時候  我會自動先取查找是否有該隨機字符串 
        若是有 正常提交
        若是沒有  直接報403 
        
       
    """
    什麼是xxx
    爲何要有xxx
    如何使用xxx
    """
        form表單
            你在寫的時候只須要加上一個
            {% csrf_token %}
        
        
        ajax
            第一種  本身再頁面上先經過{% csrf_token %}獲取到隨機字符串  而後利用標籤查找 
            data:{'username':'jason','csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()},
            第二種
            data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},
            第三種
            拷貝js文件
            
            
            
    裝飾器
        csrf_exempt  只有兩種裝飾的方式
        from django.views.decorators.csrf import csrf_exempt, csrf_protect
        from django.utils.decorators import method_decorator
        # 第一種
        # @method_decorator(csrf_exempt,name='dispatch')
        class MyCsrf(View):
            # 第二種
            @method_decorator(csrf_exempt)
            def dispatch(self, request, *args, **kwargs):
                return super().dispatch(request,*args,**kwargs)
            def get(self,request):
                return HttpResponse('hahaha')
                
        除了csrf_exempt以外 全部的其餘裝飾器 在CBV上面都有三種方式
        @method_decorator(csrf_protect,name='post')
        class MyCsrf(View):
            @method_decorator(csrf_protect)
            def dispatch(self, request, *args, **kwargs):
                return super().dispatch(request,*args,**kwargs)
            def get(self,request):
                return HttpResponse('hahaha')

            @method_decorator(csrf_protect)
            def post(self,request):
                return HttpResponse('post')

88程序員

相關文章
相關標籤/搜索