1. 程式人生 > >python第一百零九天---Django 4

python第一百零九天---Django 4

超時 display form 完成 save blog username back use

session  :
1. Session
基於Cookie做用戶驗證時:敏感信息不適合放在cookie中


a. Session原理
Cookie是保存在用戶瀏覽器端的鍵值對
Session是保存在服務器端的鍵值對:
保存在數據庫
使用session 前需要 執行
--Python manage.py makemigrations
--python manage.py migrate
保存在內存中的形式:
‘隨機字符串‘:{
‘username‘: ‘....‘,
‘loging‘: ‘....‘,
....
}

b. Cookie和Session對比

c. Session配置(缺少cache)

d. 示例:實現兩周自動登陸
- request.session.set_expiry(60*10)
- SESSION_SAVE_EVERY_REQUEST = True

PS: cookie中不設置超時時間,則表示關閉瀏覽器自動清除


- session依賴於cookie
- 服務器session
request.session.get()#獲取
request.session[x] = x

request.session.clear()

- 引擎配置
技術分享
 1 CACHES = {
 2             default: {
 3                 BACKEND: django.core.cache.backends.filebased.FileBasedCache,
 4                 LOCATION: os.path.join(BASE_DIR,cache)
 5                 }
 6             }
 7        SESSION_ENGINE = django.contrib.sessions.backends.db   # 引擎(默認)#保存在數據庫中
8 9 SESSION_ENGINE = django.contrib.sessions.backends.cache #在緩存中 10 11 SESSION_ENGINE = django.contrib.sessions.backends.file #在文件中 12 13 SESSION_ENGINE = django.contrib.sessions.backends.cached_db #緩存加數據庫 14 15 SESSION_ENGINE = django.contrib.sessions.backends.signed_cookies
#加密cookies
View Code


- 配置文件中設置默認操作(通用配置):

 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過期(默認)
      # set_cookie(‘k‘,123)
      SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次請求都保存Session,默認修改之後才保存(默認)


session 操作
1. 獲取session中的值
request.session[key]  #獲取不到會報錯
request.session.get(key,None)#獲取不到返回None
    2. 設置session中的值
 request.session[key]=123# 沒有創建 有則替換
request.session.setdefault(key,123)#存在則不替換
刪除:
 del request.session[key]

3. 所有 鍵 值 鍵值對
        request.session.keys() #
        request.session.values() #
        request.session.items() #鍵值對
        request.session.iterkeys() #
        request.session.itervalues() #
        request.session.iteritems() #
        #用戶session的隨機的字符串
            request.session.session_key
        #將所有Session失效日期小於當日期的數據刪除
            request.session.clear_expired()
        #檢查 用戶session的隨機字符串 在數據庫中是否存在
            requset.session.exists(session_key)#request.session.get(‘key‘,None)#包含了
        #刪除 用戶session的隨機字符串 及對應的 鍵值
            requset.session.delete(session_key)
            request.session.clear()#註銷使用    
        #設置超時時間 :
request.session.set_expiry(value)
                * 如果valus為整數 ,session會在秒數後失效
                * 如果valus為datatime或timedelta ,session會在這個時間後失效
                * 如果valus為0 ,session會在關閉瀏覽器後失效
                * 如果valus為0 ,session會在關閉瀏覽器後失效
####################################   CSRF   #########################################
CSRF:
a. CSRF原理
{%csrf_token%}#前端生成一個隨機字符串
--在表單中 和COOKIS 中都有存在 但不一樣

django為用戶實現防止跨站請求偽造的功能,
通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。
而對於django中設置防跨站請求偽造功能有分為全局和局部。
全局
--在全局發送POST數據時,需要 csrf_token
局部
[email protected]_protect,為當前函數強制設置防跨站請求偽造功能,即便settings中沒有設置全局中間件。
[email protected]_exempt,取消當前函數防跨站請求偽造功能,即便settings中設置了全局中間件。
註:from django.views.decorators.csrf import csrf_exempt,csrf_protect

b. 無CSRF時存在隱患
c. Form提交 (CSRF)
<form>
{%csrf_token%}
</form>
d. Ajax提交 (CSRF)
CSRF請求頭 X-CSRFToken (不能有下劃線)
示例:

$(function(){
          //
            $.ajaxSetup({//當前所有ajax發送 全局
                beforeSend: function(xhr,settings){//發送ajax前 先執行這個函數
                    xhr.setRequestHeader(X-CSRFtoken, $.cookie(csrftoken));
                }
            });

            $(#btn1).click(function () {
                $.ajax({
                    url: /login/,
                    type:"GET",
                    data: {user: root, pwd: 123},
                    // headers: {X-CSRFtoken: $.cookie(csrftoken)},
                    success:function(arg){

                    }
                })
            });
        })



python第一百零九天---Django 4