Django बाकी ढांचा: गैर-मॉडल धारावाहिक


158

मैं Django बाकी ढांचे में शुरुआत कर रहा हूं और आपकी सलाह की जरूरत है। मैं एक वेब सेवा विकसित कर रहा हूं। सेवा को अन्य सेवाओं के लिए REST इंटरफ़ेस प्रदान करना है। REST इंटरफ़ेस, जिसे मुझे लागू करने की आवश्यकता है, मेरे मॉडल के साथ सीधे काम नहीं कर रहा है (मेरा मतलब है कि गेट, पुट, पोस्ट, ऑपरेशन हटाएं)। इसके बजाय, यह कुछ गणना परिणामों के साथ अन्य सेवाएं प्रदान करता है। एक अनुरोध पर मेरी सेवा कुछ गणनाएँ करती है और बस परिणाम वापस करती है (परिणामों को अपने डेटाबेस में संग्रहीत नहीं करती है)।

नीचे मेरी समझ है कि REST इंटरफ़ेस कैसे लागू किया जा सकता है। अगर मैं ग़लत हूं तो मेरी गलती सुझाएं।

  1. वर्ग बनाएं जो गणना करता है। इसे 'CalcClass' नाम दें। CalcClass अपने काम में मॉडल का उपयोग करता है।
    • गणनाओं के लिए आवश्यक परमिशन को कंस्ट्रक्टर को पास किया जाता है।
    • कैल्क ऑपरेशन को लागू करें। यह 'परिणाम' के रूप में परिणाम देता है।
  2. ResultClass बनाएँ।
    • वस्तु से व्युत्पन्न।
    • यह सिर्फ calc परिणाम युक्त गुण है।
    • कैल्क परिणामों के एक हिस्से को टुपल्स के ट्यूपल के रूप में दर्शाया गया है। जैसा कि मैं समझता हूं, आगे के क्रम के लिए बेहतर होगा कि उन परिणामों के लिए एक अलग वर्ग लागू करें और ऐसी वस्तुओं की सूची को ResultClass में जोड़ें।
  3. ResultClass के लिए Serializer बनाएं।
    • धारावाहिक से व्युत्पन्न।
    • कैल्क परिणाम केवल पढ़ने के लिए होते हैं, इसलिए विशेष कक्षाओं जैसे कि इंटेगरफिल्ड के बजाय खेतों के लिए ज्यादातर फील्ड क्लास का उपयोग करें।
    • मुझे सेव () विधि को न तो ResultClass पर, न ही Serializer पर निहित करना चाहिए, क्योंकि मैं परिणामों को संग्रहीत नहीं करने जा रहा हूं (मैं केवल उन्हें अनुरोध पर वापस करना चाहता हूं)।
    • नेस्टेड परिणामों के लिए इम्प्लांट सीरलाइज़र (ऊपर उल्लिखित टुपल्स को याद रखें)।
  4. गणना परिणाम वापस करने के लिए दृश्य बनाएं।
    • एपीव्यू से व्युत्पन्न।
    • बस जरूरत है ()।
    • प्राप्त () में अनुरोध से प्राप्त परम के साथ कैलक्लास बनाएं, इसके कैल्क () को कॉल करें, ResultClass प्राप्त करें, Serializer बनाएं और इसके लिए ResultClass पास करें, Response (serializer.data) वापस करें।
  5. यूआरएल
    • मेरे मामले में कोई आपी नहीं है। मेरे पास विभिन्न कैल्क परिणाम (अलग-अलग पैराम के साथ कैल्क) प्राप्त करने के लिए बस यूआरएल होना चाहिए।
    • एपीआई ब्राउज़िंग के लिए कॉलिंग format_suffix_patterns जोड़ें।

क्या मैं कुछ भुल गया? क्या दृष्टिकोण सामान्य रूप से सही है?


यह दृष्टिकोण सही है और मेरे लिए वास्तव में स्वीकृत उत्तर (परिणाम पुन: प्रयोज्य परिणाम में संलग्न डेटा) की तुलना में अधिक सुरुचिपूर्ण दिखता है। लेकिन दिन के अंत में यह ज्यादातर व्यक्तिगत पसंद का सवाल होता है और दोनों काम करते हैं।
zepp.lee

जवाबों:


157

जोंगो-रेस्ट-फ्रेमवर्क एक मॉडल को बांधने के बिना भी अच्छी तरह से काम करता है। आपका दृष्टिकोण ठीक लगता है, लेकिन मेरा मानना ​​है कि आप सब कुछ प्राप्त करने के लिए कुछ चरणों को ट्रिम कर सकते हैं।

उदाहरण के लिए, बाकी ढांचा कुछ अंतर्निहित रेंडरर्स के साथ आता है। बॉक्स से बाहर यह JSON और XML को API उपभोक्ता को वापस कर सकता है। तुम भी आवश्यक अजगर मॉड्यूल स्थापित करके YAML को सक्षम कर सकते हैं। Django-rest-Framework आपके हिस्से पर किसी भी अतिरिक्त काम के बिना किसी भी मूल वस्तु जैसे कि तानाशाही, सूची और टपल का उत्पादन करेगा।

तो मूल रूप से आपको केवल उस फ़ंक्शन या वर्ग को बनाना होगा जो तर्कों में लेता है, सभी आवश्यक गणना करता है और इसके परिणाम को REST api दृश्य में टपल देता है। अगर JSON और / या XML आपकी ज़रूरतों को पूरा करता है, तो django-rest-Framework आपके लिए क्रमबद्धता का ध्यान रखेगा।

आप इस स्थिति में चरण 2 और 3 को छोड़ सकते हैं, और गणना के लिए केवल एक वर्ग का उपयोग कर सकते हैं और एक एपीआई उपभोक्ता के लिए प्रस्तुति के लिए।

यहाँ कुछ स्निपेट आपकी मदद कर सकते हैं:

कृपया ध्यान दें कि मैंने इसका परीक्षण नहीं किया है। यह केवल एक उदाहरण के रूप में है, लेकिन यह काम करना चाहिए :)

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

बाकी दृश्य:

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
हाय गेब्रियल! आपके उत्तर के लिए धन्यवाद! मैंने अपनी योजना के अनुसार पहले से ही लागू की गई चीजों की आवश्यकता है। ठीक काम करता है! मैंने बेहतर जौसन आउटपुट के लिए सीरीकेज़र का उपयोग किया।
जाखड़

3
मैंने इस सुझाव का पालन करने की कोशिश की है, लेकिन मुझे लगता है: "DjangoModelPien को उस दृश्य पर लागू नहीं किया जा सकता है जिसमें कोई संपत्ति .modelया .querysetसंपत्ति नहीं है ।" मैंने दिए गए सटीक उदाहरण की कोशिश की है। यह django-rest- फ्रेमवर्क के हाल के संस्करण के साथ कुछ हो सकता है?
ऑरलैंडो

यह उदाहरण कुछ समय पहले लिखा गया है। मुझे तब से Django के साथ काम करने का मौका नहीं मिला है। लेकिन आपको यहाँ कुछ उपयोगी मिल सकता है: django-rest-framework.org/api-guide/routers
Gabriel Samfira

1
यह उदाहरण बिल्कुल वही है जो मुझे अपनी आवश्यकता की आवश्यकता है एक ऐसी सेवा है जो एक गैर मॉडल धारावाहिक के बिना कुछ संचालन कर रही है!
खलील TABBAL

@ ऑरलैंडो: यहां देखें कि कैसे गैर-मॉडल दृश्य के लिए विशिष्ट तर्क को लागू करने के लिए 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.