Django REST framework: non-model serializer

前端 未结 2 959
独厮守ぢ
独厮守ぢ 2020-12-04 05:08

I am beginner in Django REST framework and need your advice. I am developing a web service. The service has to provide REST interface to other services. The REST interface,

相关标签:
2条回答
  • 2020-12-04 05:15

    In the urls.py, the function login_required requires

    from django.contrib.auth.decorators import login_required
    
    0 讨论(0)
  • 2020-12-04 05:29

    Django-rest-framework works well even without tying it to a model. Your approach sounds ok, but I believe you can trim some of the steps to get everything working.

    For example, rest framework comes with a few built-in renderers. Out of the box it can return JSON and XML to the API consumer. You can also enable YAML by just installing the required python module. Django-rest-framework will output any basic object like dict, list and tuple without any extra work on your part.

    So basically you only have to create the function or class that takes in arguments, does all of the required calculations and returns its results in a tuple to the REST api view. If JSON and/or XML fits your needs, django-rest-framework will take care of the serialization for you.

    You can skip steps 2 and 3 in this case, and just use one class for calculations and one for presentation to the API consumer.

    Here are a few snippets may help you out:

    Please note that I have not tested this. It's only meant as an example, but it should work :)

    The 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
    

    The REST view:

    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
    

    Your 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'),
    )
    

    This code should output a list of lists when you access http://example.com/api/v1.0/resource/?format=json. If using a suffix, you can substitute ?format=json with .json. You may also specify the encoding you wish to get back by adding "Content-type" or "Accept" to the headers.

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

    Hope this helps you out.

    0 讨论(0)
提交回复
热议问题