【问题标题】:Django Rest Framework: Function Based API serializersDjango Rest Framework:基于函数的 API 序列化器
【发布时间】:2018-03-24 19:12:11
【问题描述】:

不请自来,因为我被安排在一个 API 项目中,要求如下:

  • 姜戈
  • Django Rest 框架
  • Python 3.5
  • API 需要基于函数(所以没有类)

目标是一个以 JSON 格式返回数据(因此我只需要从 CRUD 设计原则中“读取”)供显示器内部使用的 API。

Django 本身必须连接到默认数据库和遗留的 MYSQL 数据(这可行)。我已经用settings.py 文件做到了这一点。

然后我创建了一个名为museum_api 的新应用程序;这也有效。

之后,我在python manage.py inspectdb --database=museum_data > models.py 的帮助下构建了遗留数据库的模型 上面的代码在项目的名为“musart”的根文件夹中为MYSQL数据库中的每个表生成了一个python文件(该文件夹包含:manage.py、musart和museum_api。)

然后我通过进入名为 museum_api 的文件夹创建了一个静态 JSON 响应并创建了一个文件:views.pyurls.py

我将它们留空了几秒钟,然后返回根文件夹并进入内部项目文件夹以编辑其中的 urls.py 文件。在那个文件中我添加了:

url(r'', include('museum_api.urls')), 

其意图是 API 是人们在访问该子域时首先遇到的问题。这也很好用。

然后我回到文件夹museum_api并编辑views.py文件以创建两个静态JSON响应作为测试:

from rest_framework import status, renderers
from rest_framework.decorators import api_view
from rest_framework.response import Response
from django.http import HttpResponse
from django.utils.encoding import smart_text

@api_view(['GET'])
def view(request):
    return Response({"name": "HERMÄNN", "test":"mytest"})

@api_view(['GET'])
def hello_world(request):
    return Response({"message": "Hello, world!"})

def index(request):
    return HttpResponse("""Hello, httpresonse is here!""")

接下来我在里面编辑了urls.py 文件:museum_api: 从 django.conf.urls 导入 url 从 。导入视图

urlpatterns = [
    url(r'^view$', views.view, name='view'),
    url(r'^hello$', views.hello_world, name='hello_world'),
    url(r'^$', views.index, name='index'),
]

到目前为止,我已了解所有文档;每当我运行服务器并转到 url 时,我都会得到我期望的 Indexfile 或两个 JSON 响应。

在过去的几天里,我一直坚持让 API 具有交互性……这是项目的重点……我发现的所有项目和教程都使用类,这违反了核心要求之一。

在这个阶段我只有问题,没有工作代码......

1) 下一步是为每个 api 方法创建一个函数。这方面的一个示例是使用名为 artist 的 api 方法查询所有艺术家的函数。它应该采用的参数之一是“国家”。向 api 请求数据的一种可能方式是:url?artist;format=json;country=france 我会想到这样的东西(伪代码):

def artist_api(request):
    data = select * from artists where country = 'france';
    return (data)

2) 在 museum_api > views.py 中:为什么我需要在每个新功能之前放置一个@api_view['GET']?如果我忽略它,该功能将停止工作。

3) 我如何编写序列化程序,以便在 api 收到请求(例如国家示例)时,python 脚本知道要查询哪些数据库并返回正确的数据?

4) 与 3 相关:我需要在哪里创建 serializers.py 脚本?在我的 models.py 所在的根文件夹中?还是在应用程序文件夹中?

抱歉,问题太长了。 最好的问候

【问题讨论】:

    标签: mysql django python-3.x django-rest-framework api-design


    【解决方案1】:

    2) 在 museum_api > views.py: 为什么我需要放一个@api_view['GET'] 在每个新功能之前?如果我忽略它,该功能将停止 工作。

    @api_view 装饰器告诉您的视图响应提到的 HTTP 方法。详情请见drf docs

    3) 我如何编写我的序列化程序,以便在 api 收到请求时 (比如以国家为例)python脚本知道什么 要查询并返回正确数据的数据库?

    您的视图将使用在您的settings.py 中的DATABASES 设置中指定的数据库。

    如果您使用多个数据库,则需要设置 database routers 或者您可以使用 using() 手动选择要查询的数据库 [参见 docs]

    4) 与 3 相关:我需要在哪里创建 serializers.py 脚本?在 我的models.py 所在的根文件夹?还是在应用程序文件夹中? 通常的结构是

    application
        -- app1
          --- models.py
          --- serializers.py
          --- views.py
        -- app2
          --- models.py
          --- serializers.py
          --- views.py
        -- application
          --- settings.py
          --- urls.py
        -- manage.py
    

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 2015-06-29
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 2015-11-24
      • 2014-08-20
      • 1970-01-01
      • 2018-06-23
      相关资源
      最近更新 更多