Django通过中间件支持PUT与DELETE方法
Django默认未直接支持PUT和DELETE方法的便捷处理。本文介绍通过自定义中间件HttpPost2HttpOtherMiddleware,将非GET/POST请求体解析为QueryDict并挂载至request对象,从而在视图函数中像处理POST一样获取PUT/DELETE数据,实现更友好的RESTful接口开发。
Django中PUT与DELETE方法的支持问题
在使用Django进行开发时,开发者通常会发现框架对PUT和DELETE这两种HTTP方法的支持并不直观,处理起来较为繁琐。
$.ajax({
url: 'XXX',
type: 'PUT',
dataType: 'json',
data: {
's': $("#select-id").find("option:selected").text()
},
success: function (data) {
console.log('ok');
}
})
def func(request):
if request.method == 'GET':
s = request.GET.get('s', None)
return XXX
elif request.method == 'POST':
s = request.POST.get('s', None)
return XXX
elif request.method == 'PUT':
s = request.PUT.get('s', None) # 我们希望愉快的获取继续处理
return XXX
elif request.method == 'DELETE':
s = request.DELETE.get('s', None) # 我们希望愉快的获取继续处理
return XXX
else:
pass
默认情况下,Django并未提供直接根据RESTful规范轻松编写URL处理逻辑的机制。然而,通过查阅相关资料并自定义修改,可以借助中间件功能来实现对PUT和DELETE请求的友好支持。
首先,需要在Django项目的某个应用目录下创建一个中间件Python文件,文件名可自定义,例如命名为middleware.py。
自定义中间件实现方案
#!/usr/bin/env python
# -*- coding:utf8 -*-
# __author__ = '北方姆Q'
from django.http import QueryDict
try:
from django.utils.deprecation import MiddlewareMixin # 1.10.x
except ImportError:
MiddlewareMixin = object # 1.4.x-1.9.x
class HttpPost2HttpOtherMiddleware(MiddlewareMixin):
def process_request(self, request):
"""
可以继续添加HEAD、PATCH、OPTIONS以及自定义方法
HTTP_X_METHODOVERRIDE貌似是以前版本的key???
:param request: 经过原生中间件处理过后的请求
:return:
"""
try:
http_method = request.META['REQUEST_METHOD']
if http_method.upper() not in ('GET', 'POST'):
setattr(request, http_method.upper(), QueryDict(request.body))
# except KeyError:
# http_method = request.META['HTTP_X_METHODOVERRIDE']
# if http_method.upper() not in ('GET', 'POST'):
# setattr(request, http_method.upper(), QueryDict(request.body))
except Exception:
pass
finally:
return None
接着,在Django的settings配置文件中注册该中间件,使其生效。
中间件注册与配置
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourappname.middleware.HttpPost2HttpOtherMiddleware', # 改成自己的app名称哦
]
以上即为本文介绍的全部内容,希望能为各位的学习提供帮助,同时也欢迎大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













