1. 程式人生 > 其它 >Day79--階段複習04--Ajax、Form、中介軟體、auth、cookie等元件

Day79--階段複習04--Ajax、Form、中介軟體、auth、cookie等元件

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  
# 直接:響應物件.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專案