具有多种表示/格式的Django REST API

Spi*_*der 4 python django rest

我是web开发人员的新手,我正在尝试开发一个Restful web api和一个网站的项目.我正在使用Django框架并遵循tutos,我总是将html文件看作静态,并且不同的视图呈现html模板.在我看来,这种做法在后端和前端之间并没有太大分离.是否有可能只在Django中开发后端?

编辑:

我实际上有一个更具体的问题.我有这个应用程序(记录)的视图有"patient_list"使用REST框架中的Response类,它呈现一些数据和一个像这样的html模板:

def patient_list(request):
"""
List all records, or create a new .
"""
if request.method == 'GET':
    #data = Patient.objects.all()
    data= Patient.objects.all()
    #serializer = PatientSerializer(data, many=True)
    #return JSONResponse(serializer.data)
    return Response({'patients': data}, template_name='records.html')
Run Code Online (Sandbox Code Playgroud)

在我的urls.py我有:

url(r'^records/$', views.patient_list),
Run Code Online (Sandbox Code Playgroud)

在这里我有点困惑.假设有人调用了这个/ records,所以调用了patient_list并且将使用html页面进行响应.根据我的理解(可能是错误的),一个宁静的API应该在标准视图中呈现数据,以便可以从任何"前端"(html页面或移动应用程序)使用它.这个陈述是否正确?我用错误的模板使用Response做错了吗?

bak*_*kal 6

随着Vanilla Django

当然这是可能的,没有任何额外的库来Django.

例如,您可以定义一个Django视图,该视图返回JSON数据,而不是将其呈现为HTML模板服务器端.有效地制作API而不是"网站".

这是一个基于类的视图的示例,它接受GET请求并使用JsonResponse返回一些JSON数据

from django.views.generic import View
from django.http import JsonResponse

class MyView(View):
    def get(self, request):
        my_data = {'something': 'some value'}
        return JsonResponse(my_data, mimetype='application/json')
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,你不必须使用在Django的HTML渲染设施,他们只有当你想使用它们那里.

使用REST库

当然,有很多库可以用Django构建RESTful API,比如Django REST FrameworkTastypie

多个表示和内容协商

内容协商是根据客户端或服务器首选项选择多个可能表示之一以返回到客户端的过程.

您可以在REST API中支持多种格式.例如,您可以支持HTML和JSON格式.有多种方法可以做到这一点:

  • 您可以使用GET参数?format=JSON(并将其默认为HTML,例如)
  • 你可以使用Accept标题
  • 您可能有两个URL /records.html/records.json(格式后缀方法)

有关DRF文档中此主题的更多信息

例如,如果您要使用GET参数实现第一个方法,则可以通过以下方式修改代码:

if request.method == 'GET':
    data = Patient.objects.all()
    format = request.GET.get('format', None)

    if format == 'JSON': 
        serializer = PatientSerializer(data, many=True)
        return JSONResponse(serializer.data)
    else:
        # Return HTML format by default
        return Response({'patients': data}, template_name='records.html')
Run Code Online (Sandbox Code Playgroud)