[django] Django REST 프레임 워크 : 비 모델 시리얼 라이저

Django REST 프레임 워크의 초보자이며 조언이 필요합니다. 웹 서비스를 개발 중입니다. 서비스는 다른 서비스에 REST 인터페이스를 제공해야합니다. 구현 해야하는 REST 인터페이스가 모델에서 직접 작동하지 않습니다 (get, put, post, delete 작업을 의미합니다). 대신 다른 서비스에 일부 계산 결과를 제공합니다. 요청에 따라 내 서비스는 계산을 수행하고 결과를 다시 반환합니다 (결과를 자체 데이터베이스에 저장하지 않음).

아래는 REST 인터페이스를 구현하는 방법에 대한 이해입니다. 내가 틀렸다면 나를 바로 잡으십시오.

  1. 계산하는 클래스를 만듭니다. 이름을 ‘CalcClass’로 지정하십시오. CalcClass는 작업에 모델을 사용합니다.
    • 계산에 필요한 매개 변수가 생성자에 전달됩니다.
    • 계산 작업을 구현하십시오. 결과를 ‘ResultClass’로 반환합니다.
  2. ResultClass를 작성하십시오.
    • 객체에서 파생됩니다.
    • 계산 결과를 포함하는 속성 만 있습니다.
    • 계산 결과의 한 부분은 튜플의 튜플로 표시됩니다. 내가 이해하는 것처럼, 추가 직렬화를 사용하면 해당 결과에 대해 별도의 클래스를 구현하고 이러한 객체 목록을 ResultClass에 추가하는 것이 좋습니다.
  3. ResultClass 용 시리얼 라이저를 작성하십시오.
    • 시리얼 라이저에서 파생됩니다.
    • 계산 결과는 읽기 전용이므로 IntegerField와 같은 특수 클래스 대신 필드에 주로 Field 클래스를 사용하십시오.
    • 결과를 저장하지 않기 때문에 ResultClass 나 Serializer에 save () 메서드를 impl해서는 안됩니다 (요청시 반환).
    • 중첩 된 결과를위한 Impl 시리얼 라이저
  4. 계산 결과를 반환하려면보기를 만듭니다.
    • APIView에서 파생하십시오.
    • get () 만 있으면됩니다.
    • get ()에서 요청에서 검색된 매개 변수를 사용하여 CalcClass를 작성하고 calc ()를 호출하고 ResultClass를 가져온 후 Serializer를 작성하고 ResultClass를 전달하고 Response (serializer.data)를 리턴하십시오.
  5. URL
    • 내 경우에는 api 루트가 없습니다. 다양한 calc 결과 (diff 매개 변수가있는 calc)를 얻으려면 URL이 있어야합니다.
    • API 브라우징을 위해 호출 format_suffix_patterns를 추가하십시오.

내가 뭐 놓친 거 없니? 접근법이 일반적으로 맞습니까?



답변

Django-rest-framework는 모델에 연결하지 않아도 잘 작동합니다. 귀하의 접근 방식은 괜찮은 것처럼 들리지만 모든 단계를 수행하기 위해 몇 단계를 밟을 수 있다고 생각합니다.

예를 들어 나머지 프레임 워크에는 몇 가지 기본 제공 렌더러가 제공됩니다. 즉시 JSON 및 XML을 API 소비자에게 반환 할 수 있습니다. 필요한 파이썬 모듈 만 설치하여 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에 액세스 할 때 목록 목록을 출력해야합니다 . 접미사를 사용하는 경우, 당신은 대체 할 수 있습니다 ?format=json.json. "Content-type"또는 "Accept"헤더를 추가하여 원하는 인코딩을 지정할 수도 있습니다 .

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

이것이 도움이되기를 바랍니다.


답변

urls.py에서 login_required 함수는

from django.contrib.auth.decorators import login_required


답변