29

我被分配了一项任务,我必须使用 Django 技术创建一个应用程序 API (REST)。我只需要能够从多个模型中读取 (GET) 条目,加入它们,然后使用 JSON 格式(一个或多个对象)返回它们。json 模式和适当的 json 文件的示例已经提供给我。

由于这是我第一次创建 API,而且我对 Django 不是很熟悉,所以我希望您能提供一些指导。

我搜索了两个似乎最受欢迎的框架:

正如我所看到的,这两个使您能够为您的应用程序快速设置您的 API。但是我可以使用其中一个创建自定义 JSON 格式,还是有另一种方法?

4

5 回答 5

18

使用 Tastypie:--

模型.py

class User(Document):
    name = StringField()

api.py

from tastypie import authorization
from tastypie_mongoengine import resources
from project.models import *
from tastypie.resources import *

class UserResource(resources.MongoEngineResource):
class Meta:
    queryset = User.objects.all()
    resource_name = 'user'
    allowed_methods = ('get', 'post', 'put', 'delete','patch')
    authorization = authorization.Authorization()

网址.py

from tastypie.api import Api
from projectname.api import *

v1_api = Api(api_name='v1')
v1_api.register(UserResource())

Javascript (jQuery)

这个例子是一个 GET 请求:

$(document).ready(function(){
    $.ajax({
       url: 'http://127.0.0.1:8000/api/v1/user/?format=json',
       type: 'GET',                   
       contentType: 'application/json',
       dataType: 'json',
       processData: false,
       success: function(data){
           alert(data)
       //here you will get the data from server
       },
       error: function(jqXHR, textStatus, errorThrown){
              alert("Some Error")                                  
       }
    })
})

对于 POST 请求,将类型更改为POSTdata以正确的格式发送

有关更多详细信息,请参阅Tastypie 文档

于 2013-07-10T20:41:46.953 回答
11

我使用过 Django REST 框架,并且通常喜欢它的工作原理。自动生成的人类可浏览的 API 屏幕也非常方便。

理论上,它不要求任何表示格式;您定义“序列化程序”,指定要公开哪些字段和内容,以及使用哪种串行格式。不过,有些格式比其他格式更容易。最终,您可以添加简单的基于函数的视图,这些视图返回您想要的确切 JSON 对象。即使在这种情况下,该框架也显着减少了获得完整 API 所需的工作量。

与 Django 一样,最好的方法是至少完成整个教程一次,以了解具体内容。这样做时,不要屈服于根据您的具体问题修改示例的诱惑,这只会使事情变得更加复杂。完成整个教程后,您可以告诉自己“简单”格式与您的需求有多接近。

于 2013-07-10T17:45:18.887 回答
10

使用 Django REST 框架

Django 1.8.4DRF 3.3.3

这是一个非常简单的自定义 JSONSchemaField 类,您可以使用 Django REST Framework 和jsonschema包(可通过 获得pip install jsonschema)来支持。

自定义字段继承自 DRF 的现有JSONField类,并进行了一些小的更改。它添加了根据 JSONSchema 定义验证传入 JSON 的步骤。如果验证通过,则使用 Django 模型TextField存储/检索原始 JSON 字符串。

在 app/serializers.py

import json
from rest_framework import serializers
from jsonschema import validate  # validates incoming data against JSONSchema
from jsonschema.exceptions import ValidationError as JSONSchemaValidationError
from .models import Lesson

from .jsonschema import (
    notes_schema,
)


class JSONSchemaField(serializers.JSONField):
# Custom field that validates incoming data against JSONSchema, 
# Then, if successful, will store it as a string.

    def __init__(self, schema, *args, **kwargs):
        super(JSONSchemaField, self).__init__(*args, **kwargs)
        self.schema = schema

    def to_representation(self, obj):
        return json.loads(obj)

    def to_internal_value(self, data):
        try:
            validate(data, self.schema)
        except JSONSchemaValidationError as e:
            raise serializers.ValidationError(e.message)

        return super(JSONSchemaField, self).to_internal_value(json.dumps(data))


class LessonSerializer(serializers.HyperlinkedModelSerializer):
    notes = JSONSchemaField(notes_schema)

    class Meta:
        model = Lesson
        fields = ('url', 'title', 'bpm', 'notes')

在 app/models.py

from django.db import models


class Lesson(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='Untitled')
    bpm = models.DecimalField(max_digits=5, decimal_places=2, default=120.00)
    notes = models.TextField()

    class Meta:
        ordering = ('created',)

在 app/jsonschema.py

notes_schema = {
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "name": {
                "type": "string",
                "pattern": "^[A-G][#b]?[0-9]$"
            },
            "duration": {
                "type": "string",
                "pattern": "^\d+\/\d+$"
            }
        },
        "required": ["name", "duration"]
    }
}

notes_example = [{"name": "C#4", "duration": "1/4"},
                 {"name": "A4", "duration": "1/32"}]

在应用程序/views.py

from rest_framework import viewsets

from .models import Lesson
from .serializers import LessonSerializer


class LessonViewSet(viewsets.ModelViewSet):
    queryset = Lesson.objects.all()
    serializer_class = LessonSerializer
于 2016-06-12T01:04:22.443 回答
4

另一个很好的组合是 Django-Restless,https: //django-restless.readthedocs.org/en/latest/ ,并且只是在你的模型中构建你自己的序列化器。例如

## Models
class Blog(models.Model):
    title = models.CharField()
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    text = models.TextField()

    def __init__(self, *args, **kwargs):
        self.super().__init__(*args, **kwargs)
        self.schema = { 
            "title" : self.title,
            "text"  : self.text,
            "user"  : self.user.full_name
        }

    @property
    def list_view(self):
        fields = ["title","user"]
        return {key: self.schema[key] for key in fields}

    @property
    def detail_view(self):
        fields = ["title","text","user"]
        return {key: self.schema[key] for key in fields}

## views
from restless.views import Endpoint
from .models import *
class BlogList(Endpoint):
    def get(self, request):
        posts = [blog.list_view for blog in Blog.objects.all()]
        return json.dumps({posts})

您也可以添加其他 HTTP 动词作为方法,并使用表单来验证此数据。

于 2013-07-11T16:10:22.263 回答
0

我们在服务器端使用django-piston来处理 REST 调用。它一直很好。

[客户端] ← REST → [Web-Server]—[Django/ django-piston ]

您也可以在此处查看响应。

于 2013-07-10T19:09:36.483 回答