1. 程式人生 > >django學習筆記第5日

django學習筆記第5日

方法 文件中 red get form quest 獲取 功能 header

知識點概要

- Session
- CSRF
- Model操作
- Form驗證(ModelForm)
- 中間件
- 緩存
- 信號


內容詳細:

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

a. Session原理
Cookie是保存在用戶瀏覽器端的鍵值對
Session是保存在服務器端的鍵值對

b. Cookie和Session對比

c. Session配置(缺少cache)

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

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


- session依賴於cookie
- 服務器session基本操作
# 獲取、設置、刪除Session中數據
request.session[‘k1‘]
request.session.get(‘k1‘,None)
request.session[‘k1‘] = 123
request.session.setdefault(‘k1‘,123) # 存在則不設置
del request.session[‘k1‘]

# 所有 鍵、值、鍵值對
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的隨機字符串 在數據庫中是否
request.session.exists("session_key")

# 刪除當前用戶的所有Session數據 註銷的時候用
request.session.clear()
request.session.delete("session_key")

request.session.set_expiry(value)
* 如果value是個整數,session會在些秒數後失效。
* 如果value是個datatime或timedelta,session就會在這個時間後失效。
* 如果value是0,用戶關閉瀏覽器session就會失效。
* 如果value是None,session會依賴全局session失效策略。

- 配置文件中設置默認操作(通用配置):
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,默認修改之後才保存(這是為True的話每次獲取頁面都會延時指定時候後使session過期)

- 引擎的配置
默認的為數據庫的
SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘ # 引擎(默認)
緩存
SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘ # 引擎
SESSION_CACHE_ALIAS = ‘default‘ #
CACHES = {
‘default‘: {
‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘,
‘LOCATION‘: [
‘172.19.26.240:11211‘,
‘172.19.26.242:11211‘,
]
}
‘db1‘: {
‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘,
‘LOCATION‘: [
‘172.19.26.240:11211‘,
‘172.19.26.242:11211‘,
]
}
}
使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置
文件session
SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘ # 引擎
SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()
緩存加數據庫
SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db‘ # 引擎
加密cookie Session
SESSION_ENGINE = ‘django.contrib.sessions.backends.signed_cookies‘ # 引擎

2. CSRF
a. CSRF原理
第一次獲取頁面的時候瀏覽器返回一個隨機字符串,之後提交數據的時候需要把到這個字符串去提交,不然會報錯
返回的時候還會把這個字符串放到cookie裏面,
使用form提交時候:
{% csrf_token %}
b. 無CSRF時存在隱患

c. Form提交(CSRF)

d. Ajax提交(CSRF)
CSRF請求頭 X-CSRFToken
e.個別頁面需要csrf驗證的解決方法
django為用戶實現防止跨站請求偽造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求偽造功能有分為全局和局部。
全局:
  中間件 django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect,為當前函數強制設置防跨站請求偽造功能,即便settings中沒有設置全局中間件。
@csrf_exempt,取消當前函數防跨站請求偽造功能,即便settings中設置了全局中間件。
註:from django.views.decorators.csrf import csrf_exempt,csrf_protect
ajax在setup裏面加
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});

6. 中間件

7. 緩存
5種配置
3種應用:
全局
視圖函數
模板

8. 信號
- 內置信號
- 自定義
- 定義信號
- 出發信號
- 信號中註冊函數

3. Model操作

a. 字段類型 + 參數

b. 連表字段 + 參數

c. Meta

d. SQL操作:
- 基本增刪改查
- 進階操作
- 正反查詢
- 其他操作

e. 驗證(弱)

4. Form操作
完成:
- 驗證用戶請求
- 生成HTML
(保留上一次提交的數據)

自定義:
- 類
- 字段(校驗)
- 插件(生成HTML)

初始化操作:



============= 作業:xxxoo管理 =============
用戶驗證:session
新URL:Form驗證
中間件:IP過濾
信號:記錄操作
CSRF:

a. Form驗證用戶請求

b. Form生成HTML

c. Form字段詳細(自定義字段,Model...) + 插件

d. 自定義驗證(鉤子以及__all__)

e. 註冊示例:
用戶名、密碼、郵箱、手機號(RegexValidator或RegexField)、性別、愛好、城市

f. 初始化值

5. ModelForm

a. Model+Form功能集合

b. save

c. save + save_m2m

django學習筆記第5日