Day79--階段複習04--Ajax、Form、中介軟體、auth、cookie等元件
阿新 • • 發佈:2021-11-19
1.Django與Ajax
# 通過ajax向https://api.help.bj.cn/apis/life29/?id=101060101傳送請求,看看能不能拿回資料
不能,原理上應該可以,但實際中被網路安全限制。故目前Ajax只能朝自己的伺服器 請求資料
# 一 什麼是Ajax
非同步的JavaScript和XML 非同步提交 區域性重新整理
# 二 基於jquery的Ajax實現
# 三 案例
# 四 檔案上傳
# 五 Ajax提交json格式資料
# 六 Django內建的serializers(把物件序列化成json字串)
2.分頁器元件
固定程式碼,修改就可以
3.forms元件
# 1.核心功能--欄位校驗功能 -1 寫一個類(UserForm),繼承Form -2 在類中寫欄位,pwd=forms.CharField(max_length=32,min_length=4) -3 在檢視函式中使用:form=UserForm(校驗的字典) -4 form.is_valid() 通過了,就可以存起來,不通過,form.errors會有錯誤資訊 # 2.預設的校驗規則還不夠,需要自己寫鉤子函式 -區域性鉤子: def clean_欄位名(): val=self.cleaned_data.get("name") # val就是要校驗的欄位,做限制 通過直接 return val # 成功,必須把區域性鉤子的欄位返回出來 不通過丟擲 raise ValidationError("該使用者已註冊!") -全域性鉤子: def clean(self): pwd=self.cleaned_data.get('pwd') r_pwd=self.cleaned_data.get('r_pwd') if pwd and r_pwd: if pwd==r_pwd: return self.cleaned_data # 成功,必須把全域性鉤子資料返回出來 else: raise ValidationError('兩次密碼不一致') else: return self.cleaned_data # forms元件原始碼執行流程 form.is_valid() # 開始執行 form物件的is_valid()方法 開始校驗 1.內部起了一個for迴圈,檢驗每個欄位: 1.1 先去校驗該欄位配置的規則 1.2 再走該欄位的區域性鉤子函式( clean_欄位() ) 2.最後走全域性鉤子( clean() ) 3.全部校驗完成,self就會有clean_data和errors # 流程: 1 form.is_valid() 2 self.errors 3 self.full_clean() 4 self._clean_fields() # 區域性欄位的校驗(自己的和區域性鉤子) # 4.1 先是自己的校驗 ... # 4.2 再是區域性鉤子校驗 if hasattr(self, 'clean_%s' % name): func=getattr(self, 'clean_%s' % name) value = func() self.cleaned_data[name] = value # 所以,這裡是為什麼區域性鉤子必須將 欄位返回出來 self._clean_form() # 全域性鉤子 self._post_clean() # 原始碼,再預留了一個內部鉤子,基本用不到
4.cookie與session元件
cookie
# 設定cookie # 直接:響應物件.set_cookice(key,value) respons = HttpResonse物件 # render,JsonResponse,redirect, HttpResonse response.set_cookie(key,value) response.set_signed_cookie(key,value,salt='加密鹽') # 引數詳解 # 重點: key, 鍵 value, 值 max_age=None, 超時時間 cookie需要延續的時間(以秒為單位)如果引數是\ None`` ,這個cookie會延續到瀏覽器關閉為止 # 瞭解: expires=None, 超時時間(IE瀏覽器 到期時間) path='/', 指定Cookie生效的路徑,預設'/' 表示根路徑,根路徑的cookie可以被任何url的頁面訪問,瀏覽器只會把cookie回傳給帶有該路徑的頁面。 domain=None, 指定Cookie生效的域名;如果該引數設定為None ,cookie只能由設定它的站點讀取 # 你可用這個引數來構造一個跨站cookie。如, domain=".example.com"所構造的cookie對下面這些站點都是可讀的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com secure=False, 瀏覽器將通過HTTPS來回傳cookie httponly=False 只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋) # 刪除cookie response.delete_cookie("user") # 獲取cookie request.COOKIES.get('key') # request物件 request.COOKIES['key']
session
# 設定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() # key做成了生成器
request.session.itervalues()
request.session.iteritems()
# 會話session的key
request.session.session_key # 就是那個隨機字串
# 檢查會話session的key在資料庫中是否存在
request.session.exists("session_key")
# 刪除當前會話的所有Session資料(只刪資料庫)
request.session.delete()
# 刪除當前的會話資料並刪除會話的Cookie(資料庫和cookie都刪)。
request.session.flush()
這用於確保前面的會話資料不可以再次被使用者的瀏覽器訪問
例如,django.contrib.auth.logout() 函式中就會呼叫它。
# 設定會話Session和Cookie的超時時間
request.session.set_expiry(value)
* 如果value是個整數,session會在些秒數後失效。
* 如果value是個datatime或timedelta,session就會在這個時間後失效。
* 如果value是0,使用者關閉瀏覽器session就會失效。
* 如果value是None,session會依賴全域性session失效策略(14天)。
# 將所有Session失效日期小於當前日期的資料刪除
request.session.clear_expired()
5.中介軟體元件
process_request(self,request):
return response(不再往後走,直接就回去了)
return None 會繼續往後走
process_response(self, request, response):
return response(否則報錯)
# 進來的時候,從上往下執行
# 出的時候,從下往上
6.Auth模組
# 記住這些
authenticate()
login(HttpRequest, user)
logout(request)
is_authenticated()
login_requierd()
create_user()
create_superuser()
check_password(password)
set_password(password)
#擴充套件auth_user表
自己寫一個類,繼承AbstractUser,自己寫擴充套件欄位
在setting中配置:AUTH_USER_MODEL = "app名.UserInfo"
作業:
# 1 學的不好的同學:用ajax提交一個json格式資料,返回一個json格式資料,console.log打印出來
# 2 通過ajax上傳一個檔案並儲存起來,前端接收到,彈窗說上傳成功
# 3 大家都寫的:
用ajax提交使用者的註冊資訊(使用者名稱,密碼,確認密碼,年齡)(json),form元件做認證,姓名要大於4,小於16,不能以sb開頭和結尾,使用者名稱如果存在,也不能存進去,密碼(最大16位,最小4位),年齡,小於150,大於18歲,密碼和確認密碼要一致,校驗通過,存到user表中,
# 4 讀一下forms執行流程
# 5 自己手動實現一個存檔案的session
# 6 自定製一個session字典
# 7 敲一遍bbs專案