/ / कैसे आंतरिक कार्यों को लपेटने के लिए Tastypie का उपयोग करें - django, api, rest, tastypie

आंतरिक कार्यों को लपेटने के लिए Tastypie का उपयोग कैसे करें - django, api, rest, tastypie

मेरे पास एक Django वेब एप्लिकेशन है, जो अनुमति देता हैउपयोगकर्ताओं को यूआई से HTTP पर एक रिमोट सर्वर पर स्टॉप / स्टार्ट / इंस्टाल_पैक करने के लिए। Django वेब ऐप ने पहले से लागू किए गए / install_pkg फ़ंक्शंस शुरू / बंद कर दिए हैं जो मूल रूप से उपयुक्त URL बनाता है और HTTP url को परमेस के साथ कॉल करता है।

मेरा लक्ष्य समान आंतरिक कार्यों का उपयोग करना है जब उपयोगकर्ता निम्नलिखित की तरह REST कॉल करता है:

1. https://api/v1/server/<server_name>/start/?api_key=<api_key>&params=<params>
2. https://api/v1/server/<server_name>/stop/?api_key=<api_key>&params=<params>
3. https://api/v1/server/<server_name>/install_pkg/?api_key=<api_key>&params=<params>

और दूरस्थ सर्वर प्रतिक्रिया ऑब्जेक्ट वाले कॉलर को JSON प्रतिक्रिया लौटाएं।

अब तक मैंने रैस्ट के ऊपर Django वेब ऐप के मॉडल डेटा तक रीड-ओनली एक्सेस का खुलासा करने के लिए Tastypie लाइब्रेरी का उपयोग किया है।

Tastypie ट्यूटोरियल पर गैर ओआरएम संसाधन दिखाता है कि गैर ORM संसाधनों के साथ सहभागिता कैसे करेंTastypie के 9 तरीकों को ओवरराइड करना। लेकिन अपने सीमित ज्ञान और समझ को देखते हुए मैं स्पष्ट नहीं हूँ कि अपने मामले के लिए टैस्टिपी का उपयोग कैसे करें। क्या मुझसे यहां कुछ छूट रहा है?

संपादित करें: (29 अक्टूबर 2012)

आगे स्पष्ट करने के लिए - Django वेब ऐप में ORM प्रविष्टि हैदूरस्थ सर्वर में से प्रत्येक के लिए, लेकिन यह जानकारी किसी विशेष दूरस्थ सर्वर जैसे (नाम, आईपी, डोमेन, ...) के बारे में स्थिर जानकारी है क्योंकि यह रिमोट सर्वर को Django वेब ऐप में पंजीकृत करने के समय बनाया गया है।

Django वेब ऐप से वेब सेवा कॉलदूरस्थ सर्वर दूरस्थ सर्वर (app_state, pkg_installed_list, ...) की सबसे वर्तमान स्थिति प्राप्त करता है और यह डेटा मेरे जिनागो वेब ऐप में कहीं संग्रहीत नहीं हो रहा है। यह यूआई में है के रूप में गाया जाता है।

इस प्रकार रिमोट सर्वर के बारे में Django वेब ऐप पर एक GET अनिवार्य रूप से स्थैतिक जानकारी देता है।

धन्यवाद,

उत्तर:

जवाब के लिए 8 № 1

एक तरीका केवल सर्वर संसाधनों का ट्रैक रखना है और कस्टम एंडपॉइंट्स के रूप में स्टार्ट / स्टॉप / इंस्टॉल_पाप लागू करना है।

आप सर्वर संसाधन के तहत लागू करेंगेTastypie नियमित ORM आधारित संसाधनों का उपयोग करके प्रत्येक सर्वर के लिए समापन बिंदु है। वह संसाधन पर मानक REST कार्रवाई को कार्यान्वित करता है, सर्वर जानकारी पढ़ने के लिए प्राप्त करता है, नए बनाने के लिए POST यदि आप कहते हैं कि आपके पास व्यवस्थापक उपयोगकर्ता है जिसे सेवाओं के साथ इसे संचालित करने के लिए किसी अन्य सर्वर को जोड़ने की आवश्यकता है, तो मौजूदा सर्वरों को अपडेट करने के लिए PUT / PATCH।

तब आप अतिरिक्त समाप्ति बिंदुओं को शामिल करने के लिए ServerResource का विस्तार करेंगे:

  1. का उपयोग करते हुए prepend_urls 3 कस्टम एंडपॉइंट्स को परिभाषित करने के लिए (शुरू, बंद करो, install_pkg)
  2. ServerResource के अंतर्गत इसके फ़ंक्शन में प्रत्येक समापन बिंदु को लागू करें, सुरक्षा, सीमा संचालन पर विचार करने के लिए देखभाल करते हैं (क्या आप उन पर GET या POST चाहते हैं?)

एक अन्य तरीका है ServiceResource को एक गैर ORM संसाधन के रूप में बनाना जो सर्वर संसाधन के साथ कई संबंधों में होगा। यह अधिक मुश्किल है लेकिन यकीनन बहुत क्लीनर डिजाइन है।

आपका ServiceResource 2 कस्टम होगाएंडपॉइंट्स पिछले परिदृश्य की तरह (स्टार्ट / स्टॉप) लेकिन सर्वर पर एक सेवा स्थापित करने के लिए आप एक PUT / PATCH को उस सर्वर पर भेजेंगे, जिसे आप उस सेवा के साथ जोड़ना चाहते हैं।

अधिक विशिष्ट उत्तर के लिए कृपया अधिक विशिष्ट प्रश्न बताएं।


आगे बढ़ने के तरीके के बारे में कुछ ठोस विवरणों के लिए Tastypie रसोई की किताब देखें:

इस खोज उदाहरण का उपयोग करता है override_urls जिसे आप 0.9.11 में उपयोग करना चाहते हैं और उसके समान व्यवहार है prepend_urls 0.9.12 में जो अभी तक जारी नहीं किया गया है। आप किस संस्करण के आधार पर, आपको 3 कस्टम समापन बिंदु बनाने होंगे:

 def override_urls(self):
return [
url(r"^(?P<resource_name>%s)/(?P<pk>w[w/-]*)/%start%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view("start"), name="api_start"),
url(r"^(?P<resource_name>%s)/(?P<pk>w[w/-]*)/%stop%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view("stop"), name="api_stop"),
url(r"^(?P<resource_name>%s)/(?P<pk>w[w/-]*)/%install_pkg%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view("install_pkg"), name="api_install_pkg"),
]

फिर आपको 3 हैंडलर को समान परिभाषित करने की आवश्यकता हैServerResource पर खोज उदाहरण। मैं आपको स्टार्ट फंक्शन के लिए एक शुरुआती बिंदु दूंगा। यह एक सिंक्रोनस ऑपरेशन का एक उदाहरण है। यदि आप चाहते हैं कि यह अतुल्यकालिक हो तो आपको बहुत अधिक की आवश्यकता होगी, लेकिन यह एक प्रारंभिक बिंदु है।

from tastypie.http import Http

def start(self, request, **kwargs):
self.method_check(request, allowed=["post"])
self.is_authenticated(request)
self.throttle_check(request)

try:
output = function_that_starts_server(kwargs["pk"])
except FailedException as failure:
return self.create_response(request, { "status" : "failure", "reason" : failure }, Http

self.log_throttled_access(request)
return self.create_response(request, { "status" : "success", "log" : output })