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


158

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를 추가하십시오.

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


이 접근법은 정확하며 실제로 받아 들일 수있는 대답보다 더 우아하게 보입니다 (재사용 가능한 결과 유형으로 캡슐화 된 데이터 결과). 그러나 하루가 끝나면 이것은 주로 개인 취향의 문제이며 두 가지 접근 방식이 모두 일을합니다.
zepp.lee 2019

답변:


157

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
  ]
]

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


2
안녕 가브리엘! 답변 주셔서 감사합니다! 계획에 따라 필요한 것을 이미 구현했습니다. 잘 작동합니다! 더 나은 json 출력을 위해 serializer를 사용했습니다.
Zakhar

3
나는이 제안을 따르도록 시도했지만 내가 얻을 : "이없는보기에 DjangoModelPermissions를 적용 할 수 없습니다 .model.queryset. 재산". 제공된 정확한 예제를 시도했습니다. 최신 버전의 django-rest-framework로 인한 것일 수 있습니까?
올랜도

이 예제는 얼마 전에 작성되었습니다. 이후 장고와 다시 일할 기회가 없었습니다. 하지만 당신은 여기에 유용한 뭔가를 찾을 수 있습니다 django-rest-framework.org/api-guide/routers을
가브리엘 Samfira에게

1
이 예제는 정확히 내가 필요로하는 것이 아닌 모델 serializer없이 일부 작업을 수행하는 서비스입니다!
Khalil TABBAL

: @Orlando는 : djang-restframework 3 비 모델 뷰에 대한 권한 로직 특정을 구현하는 방법을 여기 보라 stackoverflow.com/a/34040070/640916
djangonaut

-1

urls.py에서 login_required 함수는

from django.contrib.auth.decorators import login_required

답변이 아닌 의견 일 경우, add a comment세션 을 사용하는 것이 좋습니다
lucascavalcante
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.