1. 程式人生 > >Python系統學習-21

Python系統學習-21

1.中介軟體
https://www.cnblogs.com/maple-shaw/articles/9333824.html

	1. Django的請求的生命週期
	2. 中介軟體的五種方法
	
		process_request(self,request)
			1. 執行時間
				在檢視函式執行之前
			2. 引數
				request :請求物件 和檢視的引數是一個 
			3. 執行順序
				按照註冊的順序 順序執行 
				
			4. 返回值
				None  : 正常流程
				response物件: 正常流程後的process_request方法、檢視都不執行,執行執行當前中介軟體的process_response,
				response物件返回給瀏覽器
			
		
		process_response(self, request, response)
			1. 執行時間
				在檢視函式執行之後
			2. 引數
				request :請求物件 和檢視的引數是一個 
				response : 檢視返回的響應物件
			3. 執行順序
				按照註冊的順序 倒敘執行
				
			4. 返回值
				response物件:必須返回
		
		process_view(self, request, view_func, view_args, view_kwargs)
			1. 執行時間
				在檢視函式執行之前,在process_request之後,在路由匹配之後
			2. 引數
				request :請求物件 和檢視的引數是一個 
				view_func:檢視函式
				view_args:檢視函式的位置引數
				view_kwargs:檢視函式的關鍵字引數
			3. 執行順序
				按照註冊的順序 順序執行
				
			4. 返回值
				None  : 正常流程
				response物件: 之後中間的process_view方法、檢視不執行,執行所有中間的process_response
		process_template_response(self,request,response)
			1. 執行時間
				觸發條件: 檢視返回響應物件有一個render方法
				時間:  在檢視執行之後
				
			2. 引數
				request :請求物件 和檢視的引數是一個 
				response : 檢視返回的響應物件
			3. 執行順序
				按照註冊的順序 倒敘執行
				
			4. 返回值
				response物件: 必須的

		process_exception(self, request, exception)
			1. 執行時間
				觸發條件: 檢視層面有錯誤之後執行
			2. 引數:
				request :請求物件 和檢視的引數是一個
				exception:  錯誤物件
			3. 執行順序
				按照註冊的順序 倒敘執行
			4. 返回值
				None: 正常報錯 
				response物件:之後的中介軟體process_exception方法不執行,執行所有中介軟體的process_response

	3. csrf中介軟體原始碼分析
		from django.views.decorators.csrf import csrf_exempt,csrf_protect
	
2. ajax
	https://www.cnblogs.com/maple-shaw/articles/9524153.html
	1. 發請求的途徑
		1. 在瀏覽器地址上輸入地址  回車  ——》 GET
		2. form表單                      ——》 GET / POST
		3. a標籤                         ——》 GET
	2. ajax
		使用js技術傳送非同步請求 一般傳輸json資料
		特點:
			區域性重新整理 當前頁面不重新整理
			非同步 
	
	1. 計算示例
	
		 $.ajax({
			url:'/calc1/',
			type:'post',
			data:{
				i1:$('[name="ii1"]').val(),
				i2:$('[name="ii2"]').val()
			},
			success:function (res) {
				console.log(res);
				$('[name="ii3"]').val(res)
			}
		})
	2. ajax的引數介紹
		上傳檔案
			form_obj = new FormData();
			form_obj.append('f1', $('#f1')[0].files[0]);
			$.ajax({
				url: '/upload/',
				type: 'post',
				processData: false,   # 告訴ajax不處理編碼方式
				contentType: false,	  # 告訴ajax不處理contentType
				data: form_obj,
				success: function (res) {
					console.log(res);     # 返回的響應的響應體
				},
			})
			
	3. 提交post請求的設定
		前提有cookie csrftoken 
		1. 
			使用 {% csrf_token %}
			data: {
            i1: $('[name="i1"]').val(),
            i2: $('[name="i2"]').val(),
            csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()
        },
		
		2. 
			headers:{'X-csrftoken':$('[name="csrfmiddlewaretoken"]').val()},
		3. 使用檔案
			

3. form元件
	https://www.cnblogs.com/maple-shaw/articles/9537309.html
	1. 註冊示例
	2. form元件的使用
		1. 定義
		# 註冊form
		class RegForm(forms.Form):
			user = forms.CharField(label='使用者名稱')
			pwd = forms.CharField(label='密碼',widget=forms.widgets.PasswordInput)
			
			
		2. 使用
			1. 檢視中
				form_obj = RegForm()
				
				form_obj = RegForm(request.POST)
				form_obj.is_valid    布林值
				
			2. 模板中
				{{ form_obj.as_p }}   —— 》 生成P標籤 (label 和 input)
				
				{{ form_obj.user }}   —— 》 生成input框
				{{ form_obj.pwd }}
				
				{{ form_obj.pwd.label }}  ——》 對應的中文
				{{ form_obj.pwd.id_for_label }}  ——》 input的ID
				

				{{ form_obj.errors }}  —— 》 所有錯誤提示
				{{ form_obj.pwd.errors }}  —— 》 某個欄位的所有錯誤提示
				{{ form_obj.pwd.errors.0 }}  —— 》 某個欄位的第一錯誤提示
		
	3. 欄位及引數介紹
		見部落格
				min_length=8,
				max_length=16,
				label='使用者名稱',
				initial='alex',
				widget=forms.widgets.Input(attrs={'class': 'form-control'}),
				error_messages=
				
	4. 內建校驗器和自定義檢驗
		1. 內建的校驗
			min_length=8,
			max_length=16,
			required 
		2. 自定義校驗
			1. 提供校驗的類
			from django.core.validators import RegexValidator
			
			2. 函式
			from django.core.exceptions import ValidationError

			def check_name(value):

				if 'alex' in value:
					raise ValidationError('涉黃')
	5. is_valid原始碼解析及區域性、全域性鉤子
	
		1. 區域性鉤子
			校驗某個欄位
			    def clean_pwd(self):
					value =self.cleaned_data.get('pwd')
					if len(value)<6:
						raise ValidationError('密碼少於6位')

					return value
		2. 全域性鉤子
			def clean(self):
				pwd = self.cleaned_data.get('pwd')
				re_pwd = self.cleaned_data.get('re_pwd')
				if pwd == re_pwd:
					return self.cleaned_data
				self.add_error('re_pwd','兩次密碼不一致')
				raise ValidationError('兩次密碼不一致')
								
	
4. auth模組
	https://www.cnblogs.com/maple-shaw/articles/9537320.html
	1. 登入
		1. auth.authenticate  驗證使用者名稱和密碼
			obj = auth.authenticate(request, username=user, password=pwd)
		2. login(request,user)	儲存登入狀態 寫session
		
		3. login_required  登入之後才能訪問某個頁面
			from django.contrib.auth.decorators import login_required
		4. request.user.is_authenticated()  判斷登入狀態
		
	2. 登出
	3. 註冊
	4. 擴充套件auth表