2015-05-15 29 views
26

में रीस्टफुल एपीआई से डेटा उपभोग करने का सही तरीका मैं डीजेंगो सीखने की कोशिश कर रहा हूं, जबकि मेरे पास वर्तमान समाधान है, मुझे यकीन नहीं है कि यह डीजेंगो में सर्वोत्तम प्रथाओं का पालन करता है या नहीं। मैं अपनी वेबसाइट पर एक वेब एपीआई से जानकारी प्रदर्शित करना चाहता हूं। मान लीजिए कि API URL इस प्रकार है दो:डीजेंगो

http://api.example.com/books?author=edwards&year=2009 

Thsis एडवर्ड्स द्वारा पुस्तकों निम्न स्वरूप में 2009 लौटाया साल में लिखा की एक सूची वापसी होगी:

{'results': 
      [ 
       { 
        'title':'Book 1', 
        'Author':'Edwards Man', 
        'Year':2009 
       }, 
       { 
        'title':'Book 2', 
        'Author':'Edwards Man', 
        'Year':2009} 
      ] 
} 

वर्तमान में मैं एपीआई लेने वाली हूँ मेरे विचार में इस प्रकार फ़ाइल:

class BooksPage(generic.TemplateView): 
    def get(self,request): 
     r = requests.get('http://api.example.com/books?author=edwards&year=2009') 
     books = r.json() 
     books_list = {'books':books['results']} 
     return render(request,'books.html',books_list) 

आम तौर पर, हम models.py फ़ाइल में डेटाबेस से डेटा हड़पने, लेकिन मैं अनिश्चित हूं अगर मैं models.py या views.py में इस एपीआई डेटा हथियाने किया जाना चाहिए। यदि यह models.py में होना चाहिए, तो क्या कोई यह उदाहरण दे सकता है कि यह कैसे करें? मैंने ऊपर दिए गए उदाहरण को स्टेक ओवरफ्लो के लिए विशिष्ट रूप से लिखा है, इसलिए कोई भी बग पूरी तरह से यहां लिखने का परिणाम है।

+1

Django Rest Framework देखें। – alexhb

+14

क्या यह वेब एपिस बनाने के लिए नहीं है? मैं बाहरी से पढ़ने की कोशिश कर रहा हूं। – user2694306

उत्तर

60

मुझे एक अलग सेवा परत (services.py) में उस तरह के तर्क को डालने का दृष्टिकोण पसंद है; जो डेटा आप प्रस्तुत कर रहे हैं वह Django ORM भावना में "मॉडल" नहीं है, और यह सरल "दृश्य" तर्क से अधिक है। एक स्वच्छ encapsulation सुनिश्चित करता है कि आप बैकिंग सेवा के लिए इंटरफ़ेस को नियंत्रित करने जैसी चीजें कर सकते हैं (यानी, इसे पैरामीटर के साथ एक पायथन एपीआई बनाम यूआरएल की तरह दिखाना), कैशिंग जैसे संवर्धन जोड़ें, जैसा कि @sobolevn उल्लेख किया गया है, अलगाव में एपीआई का परीक्षण करें, आदि

तो मैं एक साधारण services.py सुझाव देंगे, कुछ इस तरह दिखता है कि:

def get_books(year, author): 
    url = 'http://api.example.com/books' 
    params = {'year': year, 'author': author} 
    r = requests.get(url, params=params) 
    books = r.json() 
    books_list = {'books':books['results']} 
    return books_list 

नोट कैसे पैरामीटर पारित कर दिया हो (requests पैकेज की क्षमता का उपयोग)।

views.py में फिर

:

import services 
class BooksPage(generic.TemplateView): 
    def get(self,request): 
     books_list = services.get_books('2009', 'edwards') 
     return render(request,'books.html',books_list) 

यह भी देखें:

+0

क्या मुझे यहाँ कुछ याद आ रही है? 'get_books()' एक चर वापस नहीं कर रहा है ... –

+0

वह उत्तर में एक चूक था। सही किया। – bimsapi

+0

@ बिम्सपाई - क्या कोई सीआरयूडी संचालन के लिए इस दृष्टिकोण का उपयोग कर सकता है - या - किसी प्रकार का क्रमिकरण होना चाहिए? इन विकल्पों को देखा है: http://www.django-rest-framework.org/api-guide/serializers/#modelserializer https://pypi.python.org/pypi/django-rest-models टीआईए –

1

ठीक है, ध्यान में रखने के लिए कई चीजें हैं। सबसे पहले, इस मामले में आपका डेटा अक्सर बदल नहीं रहा है। तो इस तरह के responces कैश करने के लिए यह एक अच्छा अभ्यास है। आसपास के बहुत सारे कैशिंग उपकरण हैं, लेकिन redis एक लोकप्रिय विकल्प है। वैकल्पिक रूप से, आप केवल कैशिंग के लिए अतिरिक्त NoSQL डेटाबेस चुन सकते हैं।

दूसरा, इस डेटा को प्रदर्शित करने का उद्देश्य क्या है? क्या आप अपने उपयोगकर्ताओं को किताबों या लेखकों, आदि के साथ बातचीत करने की उम्मीद कर रहे हैं? यदि यह सिर्फ एक जानकारी है, तो फॉर्म और मॉडल में कोई आवश्यकता नहीं है। यदि नहीं, तो आपको पुस्तकों और लेखकों दोनों के लिए उचित विचार, रूप और मॉडल प्रदान करना होगा।

और उस स्थान पर विचार करने के लिए जहां आपको एपीआई अनुरोध कहना चाहिए, मैं कहूंगा कि यह दूसरे प्रश्न पर भारी निर्भर करता है। विकल्प हैं:

  • views.py केवल डेटा प्रदर्शित करने के लिए।
  • forms.py या अभी भी views.py निष्क्रियता के लिए।
2

उपयोग के बजाय serializer।जेसन, क्योंकि यह कई प्रारूपों में लौटने के लिए लचीलापन देता है। बाकी-एपीआई का उपयोग करते समय, प्रदान किए गए सीरिएलाइज़र उपयोग को प्राथमिकता दी जाती है।

डेटा हैंडलिंग रखें और view.py में डेटा अनुरोध प्राप्त करें। फॉर्म का उपयोग templating के लिए व्यावसायिक तर्क के रूप में नहीं किया जाता है।

संबंधित मुद्दे