一、中間件

# 中間件可以對請求、響應...等功能完成過濾
#form表單完成csrf認證
<form action="/get_money/" method="post">
{% csrf_token %} #可以通過本域的安全認證
<input type="submit" value="取錢">
</form>
#ajax完成csrf認證
<button class="btn">ajax取錢</button>
<script src="/static/jquery-3.3.1.js"></script>
<script src="/static/jquery.cookie.js"></script>
#tokrn通過data來攜帶
<script>
token = $.cookie('csrftoken');
$('.btn').click(function () {
$.ajax({
url:'/get_money/',
type:'post',
data:{
'csrfmiddlewaretoken': token
},
success:function (data) {
console.log(data)
}
})
})
</script>
#token通過頭來攜帶
<script>
token = $.cookie('csrftoken');
$('.btn').click(function () {
$.ajax({
url:'/get_money/',
type:'post',
headers:{'X-CSRFToken':token},
success:function (data) {
console.log(data)
}
})
})
</script>
'''
# 自定義中間件
# 1. 在某一應用下(eg:app),建立某一py文件(eg: mymiddleware.py)
# 2. 在文件中自定義類,繼承django.utils.deprecation下的MiddlewareMixin類
# 3. 實現要過濾的方法,完成具體的過濾條件
'''
from django.utils.deprecation import MiddlewareMixin
class MyMiddleware1(MiddlewareMixin):
def process_request(self, request):
''' 請求處理
:param request:請求對象
:return: 一般沒有返回值,但可以返回HttpResponse對象
'''
def process_view(self, request, callback, callback_args, callback_kwargs):
''' 視圖函數預處理
:param request: 請求對象
:param callback: 路由返回的視圖函數地址
:param callback_args: 視圖函數的位置參數(元組)
:param callback_kwargs: 視圖函數的關鍵字參數(字典)
:return: 一般沒有返回值,但可以返回HttpResponse對象
'''
def process_exception(self, request, exception):
''' 視圖函數異常處理
:param request: 請求對象
:param exception: 視圖函數的異常對象
:return: 一般沒有返回值,但可以返回HttpResponse對象
'''
def process_template_response(self, request, response):
''' 視圖函數返回值為擁有render方法的對象,該方法會執行
:param request: 請求對象
:param response: 響應對象
:return: 一定要返回response
'''
return response
def process_response(self, request, response):
''' 響應處理
:param request: 請求對象
:param response: 響應對象
:return: 一定要返回response
'''
return response
class MyMiddleware2(MiddlewareMixin):
def process_request(self, request):
pass
#例子:
# 1. 在某一應用下(eg:app),建立某一py文件(eg: mymiddleware.py)
# 2.在mymiddleware.py下完成如下代碼
from django.utils.deprecation import MiddlewareMixin
class MyMiddleware1(MiddlewareMixin):
def process_request(self, request):
print('MyMiddleware1 request')
def process_view(self, request, callback, callback_args, callback_kwargs):
pass
def process_exception(self, request, exception):
pass
def process_template_response(self, request, response):
return response
def process_response(self, request, response):
print('MyMiddleware1 response')
return response
class MyMiddleware2(MiddlewareMixin):
def process_request(self, request):
print('MyMiddleware2 request')
def process_response(self, request, response):
print('MyMiddleware2 response')
return response
# 3.在settings中配置中間件
MIDDLEWARE = [
'app.mymiddleware.MyMiddleware1',
'app.mymiddleware.MyMiddleware2',
]
#發送url請求
#先調用中間件中的process_request,順序按照配置順序從上往下
#然后到路由層進行路由分發,隨后到中間件中的process_view,順序按照配置順序從上往下,然后process_view會調用視圖函數views
#如果視圖函數發生異常會調用中間件中的process_exception,順序按照配置順序從下到上處理,沒有處理成功會報錯
#最后調用中間件中的process_response,順序按照配置順序從下到上
#如果MyMiddleware1中的process_request直接return,那么請求會直接從這個中間件向上response,不會經過下面的中間件
#要執行中間件中process_template_response要求視圖函數返回值是含有render方法的對象
class TTT:
def render(self):
return HttpResponse('TTT 的render')
def test(request):
return TTT()
二、接口規則
'''
演示:
http://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295&output=json&query=%E8%82%AF%E5%BE%B7%E5%9F%BA®ion=%E5%8C%97%E4%BA%AC
狀態碼:
SUCCESS("0000", "查詢成功"),
NODATA("0001", "查詢成功無記錄"),
FEAILED("0002", "查詢失敗"),
ACCOUNT_ERROR("1000", "賬戶不存在或被禁用"),
API_NOT_EXISTS("1001", "請求的接口不存在"),
API_NOT_PER("1002", "沒有該接口的訪問權限"),
PARAMS_ERROR("1004", "參數為空或格式錯誤"),
SIGN_ERROR("1005", "數據簽名錯誤")
UNKNOWN_IP("1099", "非法IP請求"),
SYSTEM_ERROR("9999", "系統異常");
規范制定:
{
'statue': 0,
'msg': 'ok',
'data': {}
}
0:成功,1:成功沒結果,2:失敗
'''