जवाबों:
RESTful API डिज़ाइन करते समय कुछ सावधान रहना चाहिए, यह GET और POST का टकराव है, जैसे कि वे एक ही चीज़ थे। Django के फ़ंक्शन-आधारित दृश्यों और CherryPy के डिफ़ॉल्ट डिस्पैचर के साथ यह गलती करना आसान है , हालांकि दोनों फ्रेमवर्क अब इस समस्या ( कक्षा-आधारित विचार और MethodDispatcher , क्रमशः) के आसपास एक रास्ता प्रदान करते हैं ।
HTTP-verbs REST में बहुत महत्वपूर्ण हैं , और जब तक आप इस बारे में बहुत सावधान नहीं होते, तब तक आप REST विरोधी पैटर्न में गिरते जाएंगे ।
कुछ फ्रेमवर्क जो इसे ठीक से प्राप्त करते हैं वे हैं वेबहोम , फ्लास्क और बॉटल । जब मिमरेंडर लाइब्रेरी के साथ संयुक्त (पूर्ण प्रकटीकरण: मैंने इसे लिखा है), तो वे आपको अच्छी रेस्टफुल वेबसर्विसेज लिखने की अनुमति देते हैं:
import web
import json
from mimerender import mimerender
render_xml = lambda message: '<message>%s</message>'%message
render_json = lambda **args: json.dumps(args)
render_html = lambda message: '<html><body>%s</body></html>'%message
render_txt = lambda message: message
urls = (
'/(.*)', 'greet'
)
app = web.application(urls, globals())
class greet:
@mimerender(
default = 'html',
html = render_html,
xml = render_xml,
json = render_json,
txt = render_txt
)
def GET(self, name):
if not name:
name = 'world'
return {'message': 'Hello, ' + name + '!'}
if __name__ == "__main__":
app.run()
सेवा का तर्क केवल एक बार लागू किया जाता है, और सही प्रतिनिधित्व चयन (हेडर स्वीकार करें) + उचित रेंडर फ़ंक्शन (या टेम्पलेट) के लिए प्रेषण एक स्पष्ट, पारदर्शी तरीके से किया जाता है।
$ curl localhost:8080/x
<html><body>Hello, x!</body></html>
$ curl -H "Accept: application/html" localhost:8080/x
<html><body>Hello, x!</body></html>
$ curl -H "Accept: application/xml" localhost:8080/x
<message>Hello, x!</message>
$ curl -H "Accept: application/json" localhost:8080/x
{'message':'Hello, x!'}
$ curl -H "Accept: text/plain" localhost:8080/x
Hello, x!
अपडेट (अप्रैल 2012) : Django के क्लास-आधारित विचारों, चेरीपाइ के मेथडस्पाइचर और फ्लास्क और बॉटल फ्रेमवर्क के बारे में जानकारी जोड़ी गई। सवाल पूछने पर न तो वापस मौजूद रहे।
आश्चर्यचकित कोई भी उल्लेखित फ्लास्क नहीं ।
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
हम RESTful वेब सेवाओं के लिए Django का उपयोग कर रहे हैं ।
ध्यान दें कि - बॉक्स से बाहर - Django के पास हमारी आवश्यकताओं के लिए पर्याप्त प्रमाणीकरण नहीं था। हमने Django-REST इंटरफ़ेस का उपयोग किया , जिसने बहुत मदद की। [हमने तब से अपना रोल किया है क्योंकि हम इतने विस्तार कर चुके हैं कि यह एक रखरखाव दुःस्वप्न बन गया है।]
हमारे पास दो प्रकार के URL हैं: "html" URL जो मानव-उन्मुख HTML पृष्ठों को लागू करते हैं, और "json" URL जो वेब-सेवा उन्मुख प्रसंस्करण को लागू करते हैं। हमारे विचार कार्य अक्सर इस तरह दिखते हैं।
def someUsefulThing( request, object_id ):
# do some processing
return { a dictionary with results }
def htmlView( request, object_id ):
d = someUsefulThing( request, object_id )
render_to_response( 'template.html', d, ... )
def jsonView( request, object_id ):
d = someUsefulThing( request, object_id )
data = serializers.serialize( 'json', d['object'], fields=EXPOSED_FIELDS )
response = HttpResponse( data, status=200, content_type='application/json' )
response['Location']= reverse( 'some.path.to.this.view', kwargs={...} )
return response
बिंदु यह है कि उपयोगी कार्यक्षमता दो प्रस्तुतियों से बाहर फैली हुई है। JSON प्रस्तुति आमतौर पर केवल एक वस्तु है जिसे अनुरोध किया गया था। HTML प्रस्तुति में अक्सर सभी प्रकार के नेविगेशन एड्स और अन्य प्रासंगिक सुराग शामिल होते हैं जो लोगों को उत्पादक बनाने में मदद करते हैं।
jsonView
कार्यों सब बहुत समान हैं, जो थोड़ा कष्टप्रद हो सकता है। लेकिन यह पायथन है, इसलिए उन्हें कॉल करने योग्य वर्ग का हिस्सा बनाएं या मदद करने पर डेकोरेटर लिखें।
y = someUsefulThing(...)
एक "भयानक पुनरावृत्ति" है, तो सभी कार्यों और विधियों के सभी संदर्भ "भयानक" हैं। मैं यह समझने में विफल रहा कि किसी फ़ंक्शन को एक से अधिक बार संदर्भित करने से कैसे बचें ।
someUsefulThing(request, object_id)
एक डेटा पुनर्प्राप्ति अभिव्यक्ति है। अब आपके पास अपने कार्यक्रम में विभिन्न बिंदुओं पर एक ही अभिव्यक्ति की दो प्रतियां हैं। स्वीकृत उत्तर में, डेटा अभिव्यक्ति एक बार लिखी जाती है। अपने someUsefulThing
कॉल को एक लंबे स्ट्रिंग के साथ बदलें , जैसे paginate(request, Post.objects.filter(deleted=False, owner=request.user).order_by('comment_count'))
और कोड देखें। मुझे उम्मीद है कि यह मेरी बात को स्पष्ट करेगा।
अजगर वेब फ्रेमवर्क विकी देखें ।
आपको शायद पूर्ण स्टैक फ्रेमवर्क की आवश्यकता नहीं है , लेकिन शेष सूची अभी भी काफी लंबी है।
मुझे वास्तव में चेरीपी पसंद है । यहाँ एक आरामदायक वेब सेवा का एक उदाहरण दिया गया है:
import cherrypy
from cherrypy import expose
class Converter:
@expose
def index(self):
return "Hello World!"
@expose
def fahr_to_celc(self, degrees):
temp = (float(degrees) - 32) * 5 / 9
return "%.01f" % temp
@expose
def celc_to_fahr(self, degrees):
temp = float(degrees) * 9 / 5 + 32
return "%.01f" % temp
cherrypy.quickstart(Converter())
यह इस बात पर जोर देता है कि मुझे वास्तव में चेरीपी के बारे में क्या पसंद है; यह एक पूरी तरह से काम करने वाला उदाहरण है जो किसी ऐसे व्यक्ति के लिए भी समझ में आता है जो रूपरेखा को नहीं जानता है। यदि आप इस कोड को चलाते हैं, तो आप तुरंत अपने वेब ब्राउज़र में परिणाम देख सकते हैं; जैसे http: // localhost: 8080 / celc_to_fahr? डिग्री = 50 पर जाकर122.0
आपके वेब ब्राउजर में प्रदर्शित होगा ।
मुझे किसी कारण से रैंगो को उजागर करने के लिए Django का उपयोग करने का कोई कारण नहीं दिखता है, हल्के और अधिक लचीले समाधान हैं। Django टेबल पर बहुत सारी अन्य चीजें ले जाता है, जिनकी हमेशा जरूरत नहीं होती है। यह सुनिश्चित करने के लिए कि यदि आप केवल REST सेवा के रूप में कुछ कोड को उजागर करना चाहते हैं तो इसकी आवश्यकता नहीं है।
मेरा व्यक्तिगत अनुभव, fwiw, यह है कि एक बार जब आपके पास एक आकार-फिट-सभी रूपरेखा होती है, तो आप इसके ORM, इसके प्लग इन आदि का उपयोग करना शुरू कर देंगे, क्योंकि यह आसान है, और कुछ ही समय में आपके पास निर्भरता खत्म हो जाएगी इससे छुटकारा पाना बहुत कठिन है।
एक वेब फ्रेमवर्क चुनना एक कठिन निर्णय है, और मैं केवल एक रीस्ट एपीआई को उजागर करने के लिए एक पूर्ण स्टैक समाधान चुनने से बचूंगा।
अब, अगर आपको वास्तव में Django का उपयोग करने की आवश्यकता है / चाहती है, तो पिस्टन django ऐप्स के लिए एक अच्छा REST फ्रेमवर्क है।
कहा जा रहा है कि, चेरीपी वास्तव में बहुत अच्छी लगती है, लेकिन REST की तुलना में अधिक RPC लगती है।
नमूनों को देखते हुए (मैंने इसका इस्तेमाल कभी नहीं किया), शायद वेबस्टार सबसे अच्छा और सबसे साफ है अगर आपको केवल REST की आवश्यकता है।
यहाँ REST पर CherryPy डॉक्स में एक चर्चा है: http://docs.cherrypy.org/dev/progguide/REST.html
विशेष रूप से यह चेरीडाई डिस्पैचर में निर्मित मेथडाइस्पैचर नामक एक उल्लेख का उल्लेख करता है, जो उनके HTTP-वर्ब आइडेंटिफ़ायर (GET, POST, आदि ...) के आधार पर तरीकों का आह्वान करता है।
2010 में, पिरामिड और repoze.bfg समुदायों ने पिरामिड बनाने के लिए "ज्वाइन की" , एक वेब फ्रेमवर्क जो कि सबसे भारी रूप से repoze.bfg पर आधारित है। यह अपने मूल ढांचे के दर्शन को बनाए रखता है, और इसका उपयोग रेस्टफुल सेवाओं के लिए किया जा सकता है । यह देखने लायक है।
जिंसो अनुप्रयोगों के लिए RESTful API को छेड़ने के लिए पिस्टन बहुत लचीला ढांचा है।
लगता है कि अजगर वेब फ्रेमवर्क के सभी प्रकार अब Restful इंटरफेस को लागू कर सकते हैं।
Django के लिए, स्वाद और पिस्टन के अलावा, django-rest-ढांचा एक उल्लेख के लायक है। मैंने पहले ही अपनी एक परियोजना को सुचारू रूप से चला दिया है।
Django REST फ्रेमवर्क Django के लिए एक हल्का REST फ्रेमवर्क है, जिसका उद्देश्य अच्छी तरह से जुड़े, स्व-वर्णन करने वाले RESTful Web API को बनाना आसान है।
त्वरित उदाहरण:
from django.conf.urls.defaults import patterns, url
from djangorestframework.resources import ModelResource
from djangorestframework.views import ListOrCreateModelView, InstanceModelView
from myapp.models import MyModel
class MyResource(ModelResource):
model = MyModel
urlpatterns = patterns('',
url(r'^$', ListOrCreateModelView.as_view(resource=MyResource)),
url(r'^(?P<pk>[^/]+)/$', InstanceModelView.as_view(resource=MyResource)),
)
आधिकारिक साइट से उदाहरण लें, सभी उपरोक्त कोड एपीआई प्रदान करते हैं, स्व-व्याख्या किए गए दस्तावेज़ (जैसे साबुन आधारित वेबवर्क) और यहां तक कि सैंडबॉक्स को थोड़ा सा परीक्षण करने के लिए। बहुत सुविधा है।
मैं अजगर दुनिया का विशेषज्ञ नहीं हूं, लेकिन मैं django का उपयोग कर रहा हूं जो एक उत्कृष्ट वेब फ्रेमवर्क है और इसका उपयोग एक आरामदायक रूपरेखा बनाने के लिए किया जा सकता है।
web2py में आसानी से RESTful API का निर्माण करने के लिए समर्थन शामिल है, यहाँ और यहाँ वर्णित (वीडियो)। विशेष रूप से, उसे देखें parse_as_rest
, जो आपको URL प्रतिमानों को परिभाषित करने देता है जो डेटाबेस अनुरोधों के लिए मानचित्र अनुरोधों को दर्शाता है; और smart_query
, जो आपको URL में मनमाने प्राकृतिक भाषा के प्रश्नों को पास करने में सक्षम बनाता है।
मैं आप Django का उपयोग कर रहे हैं तो आप django-tastypie को django-piston के विकल्प के रूप में मान सकते हैं । पिस्टन की तुलना में गैर-ओआरएम डेटा स्रोतों को ट्यून करना आसान है, और इसमें महान दस्तावेज हैं ।
हम कठोर REST सेवाओं के लिए एक रूपरेखा पर काम कर रहे हैं, http://prestans.googlecode.com देखें
फिलहाल इसके शुरुआती अल्फा में, हम mod_wsgi और Google के AppEngine के खिलाफ परीक्षण कर रहे हैं।
परीक्षकों और प्रतिक्रिया की तलाश में। धन्यवाद।