那我就按照攻略的步骤一步一步讲解如何实现Django的restframework接口框架自定义返回数据格式。
1. 设置返回数据格式
在Django的settings.py文件里,我们可以通过设置REST_FRAMEWORK
参数来定义restframework框架的返回格式。其中最核心的两个参数是DEFAULT_RENDERER_CLASSES
和DEFAULT_PARSER_CLASSES
,分别表示默认的渲染器和解析器。
渲染器和解析器是restframework框架里用来将HTTP请求和响应的数据转换为具体格式的类。例如,RESTful API返回数据时可以支持多种格式,包括JSON、XML、HTML等,这些格式对应的就是渲染器(renderer);而当用户提交数据时,可以通过不同的解析器(parser)来解析用户提交的数据。
默认情况下,Django的restframework框架已经定义了适用于大多数情况的DEFAULT_RENDERER_CLASSES和DEFAULT_PARSER_CLASSES,但是如果需要自定义返回格式,我们可以重写这两个参数。
具体的实现方式是,我们需要创建一个新的渲染器类(Render class)并继承自rest_framework.renderers.BaseRenderer
,并在该类中实现render()
方法。该方法被调用时,将会拿到HTTP响应数据的字典格式,我们可以在这个方法里自定义返回格式。下面是一个示例:
from rest_framework.renderers import JSONRenderer
class CustomRenderer(JSONRenderer):
# 该类必须继承自BaseRenderer类,并且自定义的渲染器类必须重写render方法
def render(self, data, accepted_media_type=None, renderer_context=None):
"""
重写render方法,并在该方法内自定义返回数据格式
"""
status_code = renderer_context['response'].status_code
response = {
"code": status_code, # HTTP响应码
"msg": "success" if status_code in [200, 201] else "error", # HTTP响应信息
"data": data # 具体业务数据
}
return super().render(response, accepted_media_type=accepted_media_type, renderer_context=renderer_context)
以上代码中的CustomRenderer
类继承自JSONRenderer
类,并实现了render()方法,其中自定义了返回数据的格式,将HTTP响应码、HTTP响应信息和业务数据合并在一起并返回。可以发现,当HTTP响应码为200或201的时候,msg字段的值将会是"success",否则msg字段的值将会是"error"。
下面的示例,是当HTTP响应码为404的时候,调用自定义的渲染器类(CustomRenderer)后返回的结果:
{
"code": 404,
"msg": "error",
"data": "Not found"
}
2. 注册自定义渲染器
接下来,我们需要把自定义的渲染器注册到Django的restframework框架中。可以在Django的settings.py文件中的REST_FRAMEWORK
参数里添加该渲染器,具体代码如下:
REST_FRAMEWORK = {
# ...
'DEFAULT_RENDERER_CLASSES': [
'path.to.CustomRenderer',
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
],
# ...
}
以上代码中,DEFAULT_RENDERER_CLASSES
属性是一个列表,其中包含了渲染器类的全名字符串。如果需要使用自定义的渲染器,需要将它的全名添加到列表的前面,并在后面添加Django的restframework默认的渲染器。
这样做的好处是,当浏览器请求时可以优先使用Django的restframework默认的渲染器,并自动根据HTTP Accept头部来返回对应的格式(例如JSON或HTML),而不影响我们自定义的渲染器。
3. 示例1:自定义返回数据格式
下面的代码中,我们将使用Django的restframework框架来实现一个GET请求,并自定义返回数据格式。具体实现如下:
from rest_framework.views import APIView
from rest_framework.response import Response
from datetime import datetime
class TimeView(APIView):
'''
自定义返回数据格式的示例接口
'''
renderer_classes = [CustomRenderer] # 指定使用我们自定义的渲染器
def get(self, request, format=None):
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
data = {
'current_time': current_time,
}
return Response(data)
以上代码中,我们通过继承rest_framework.views.APIView
来定义了一个TimeView的类视图,在该类视图中实现了HTTP GET请求,并在该请求中自定义了返回数据的格式。具体实现步骤是:
- 在类视图中指定使用我们自定义的渲染器,即在
renderer_classes
属性中添加CustomRenderer
类; - 在HTTP GET请求中定义需要返回的数据,并将数据打包成字典;
- 使用
Response
对象将数据返回。
值得注意的是,使用Response
对象返回数据时,我们并没有指定返回的格式,而是交给了默认的渲染器来处理。因为我们已经在类视图中指定了使用自定义的渲染器,所以django-rest-framework会自动使用我们自定义的渲染器将数据格式化之后放到HTTP响应里。
如果我们使用POST等其他请求方法,需要返回HTTP响应码和HTTP响应信息时,可以在HTTP响应数据中添加这些信息,并在自定义渲染器中对它们进行处理。
4. 示例2:使用快捷函数实现自定义返回数据格式
Django的restframework框架还提供了另外一种方式,可以在视图函数中使用快捷函数。这种方式精简了代码逻辑,但是对于自定义返回数据格式比较灵活的需求而言可能不太适用。
例如,我们可以使用@api_view()
装饰器来将Python视图函数转化为Django rest-framework的APIView视图函数。具体实现方式如下:
from rest_framework.decorators import api_view
from rest_framework.response import Response
from datetime import datetime
@api_view(renderer_classes=[CustomRenderer]) # 指定使用我们自定义的渲染器
def time_view(request):
'''
自定义返回数据格式的示例接口
'''
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
data = {
'current_time': current_time,
}
return Response(data)
以上代码中,我们使用了@api_view
装饰器来将视图函数time_view
转化为Django rest-framework的APIView视图函数,并指定了使用我们自定义的渲染器。
这两种方式本质上是相同的,但是在实现过程中有所不同。如果需要实现自定义返回数据格式的其他需求,建议使用第一种方式(类视图)来进行。而如果只需要实现基本的自定义返回数据格式需求,则可以尝试使用第二种方式,并根据需要在HTTP响应数据中添加HTTP响应码和HTTP响应信息等信息。
好了,以上就是Django的restframework接口框架自定义返回数据格式的详细攻略。希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django的restframework接口框架自定义返回数据格式的示例详解 - Python技术站