tutorial - rest apis with django



Django REST框架:非模型序列化器 (1)

我是Django REST框架的初學者,需要您的建議。 我正在開發一個Web服務。 該服務必須為其他服務提供REST接口。 REST接口,我需要實現,不直接與我的模型(我的意思是獲取,放置,發布,刪除操作)。 相反,它提供了一些計算結果的其他服務。 在請求中,我的服務進行了一些計算,只是返回結果(不將結果存儲在它自己的數據庫中)。

以下是我對REST接口如何實現的理解。 糾正我,如果我錯了。

  1. 創建進行計算的類。 將其命名為'CalcClass'。 CalcClass在其工作中使用這些模型。
    • 計算所需的參數傳遞給構造函數。
    • 實施計算操作。 它將結果作為“ResultClass”返回。
  2. 創建ResultClass。
    • 從對象派生。
    • 它只是具有包含計算結果的屬性。
    • 計算結果的一部分錶示為元組的元組。 據我所知,對於進一步的序列化來說,為這些結果實現一個單獨的類並將這些對象的列表添加到ResultClass會更好。
  3. 為ResultClass創建序列化程序。
    • 從serializers.Serializer派生。
    • 計算結果是只讀的,所以大多使用Field類作為字段,而不是專用類,例如IntegerField。
    • 我不應該在ResultClass和Serializer上impl save()方法,因為我不打算存儲結果(我只是想根據請求返回它們)。
    • 用於嵌套結果的Impl序列化器(記得上面提到的元組的元組)。
  4. 創建視圖以返回計算結果。
    • 從APIView派生。
    • 只需要()。
    • 在get()中,用從請求中獲取的參數創建CalcClass,調用它的calc(),獲得ResultClass,創建Serializer並將ResultClass傳遞給它,返回Response(serializer.data)。
  5. 網址
    • 我的情況沒有api根。 我應該只有URL來獲得各種計算結果(用差異參數進行計算)。
    • 為api瀏覽添加調用format_suffix_patterns。

我錯過了什麼? 一般來說這種方法是正確的嗎?


Django-rest-framework即使不綁定到模型也可以很好地工作。 你的方法聽起來不錯,但我相信你可以修改一些步驟來讓所有的工作都能正常工作。

例如,rest框架附帶一些內置的渲染器。 開箱即可以將JSON和XML返回給API使用者。 您也可以通過安裝所需的python模塊來啟用YAML。 Django-rest-framework將輸出任何像dict,list和tuple這樣的基本對象,而不需要額外的工作。

所以基本上你只需要創建接受參數的函數或類,完成所有需要的計算並將其結果返回到REST API視圖。 如果JSON和/或XML符合您的需求,django-rest-framework將為您處理序列化。

在這種情況下,您可以跳過步驟2和步驟3,只需使用一個類進行計算,然後使用一個類向API消費者演示。

這裡有幾個片段可以幫助你:

請注意,我沒有測試過這個。 這只是作為一個例子,但它應該工作:)

CalcClass:

class CalcClass(object):

    def __init__(self, *args, **kw):
        # Initialize any variables you need from the input you get
        pass

    def do_work(self):
        # Do some calculations here
        # returns a tuple ((1,2,3, ), (4,5,6,))
        result = ((1,2,3, ), (4,5,6,)) # final result
        return result

REST視圖:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from MyProject.MyApp import CalcClass


class MyRESTView(APIView):

    def get(self, request, *args, **kw):
        # Process any get params that you may need
        # If you don't need to process get params,
        # you can skip this part
        get_arg1 = request.GET.get('arg1', None)
        get_arg2 = request.GET.get('arg2', None)

        # Any URL parameters get passed in **kw
        myClass = CalcClass(get_arg1, get_arg2, *args, **kw)
        result = myClass.do_work()
        response = Response(result, status=status.HTTP_200_OK)
        return response

你的urls.py:

from MyProject.MyApp.views import MyRESTView
from django.conf.urls.defaults import *

urlpatterns = patterns('',
    # this URL passes resource_id in **kw to MyRESTView
    url(r'^api/v1.0/resource/(?P<resource_id>\d+)[/]?$', login_required(MyRESTView.as_view()), name='my_rest_view'),
    url(r'^api/v1.0/resource[/]?$', login_required(MyRESTView.as_view()), name='my_rest_view'),
)

此代碼應在您訪問http://example.com/api/v1.0/resource/?format=json時輸出列表。 如果使用後綴,則可以用.json替換?format=json 。 您也可以通過在標題中添加"Content-type""Accept"來指定您希望獲得的編碼。

[
  [
    1, 
    2, 
    3
  ], 
  [
    4, 
    5, 
    6
  ]
]

希望這可以幫助你。





django-rest-framework