中间件以及接口原则
# 中间件可以对请求、响应...等功能完成过滤 #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:失败 '''