पायथन रेस्ट (वेब ​​सेवाओं) ढांचे की सिफारिशें? [बन्द है]


321

क्या सर्वर पर अपने स्वयं के REST API लिखने के लिए विभिन्न पायथन-आधारित REST फ्रेमवर्क की सिफारिशों की सूची कहीं है? अधिमानतः पेशेवरों और विपक्ष के साथ।

कृपया यहां सिफारिशें जोड़ने के लिए स्वतंत्र महसूस करें। :)


जवाबों:


192

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 के क्लास-आधारित विचारों, चेरीपाइ के मेथडस्पाइचर और फ्लास्क और बॉटल फ्रेमवर्क के बारे में जानकारी जोड़ी गई। सवाल पूछने पर न तो वापस मौजूद रहे।


12
यह गलत है, Django को POST बनाम GET को पहचानने और केवल कुछ तरीकों पर विचारों को सीमित करने के लिए पूर्ण समर्थन है।
ऐहलके

20
मेरा मतलब है कि, डिफ़ॉल्ट रूप से, Django POST और GET के साथ ऐसा व्यवहार करता है जैसे कि वे एक ही चीज़ थे, जो कि तब बहुत असुविधाजनक होता है जब आप Restful सेवाएं कर रहे होते हैं क्योंकि यह आपको करने के लिए मजबूर करता है: if request.method == 'GET' :__something () elif request.method == 'POST': do_something_else () web.py में वह समस्या नहीं है
मार्टिन Blech

19
@Ahnfrieden: यदि अलग-अलग HTTP क्रियाओं को अलग-अलग संभालने के लिए Django में मूल समर्थन है ("मूल" से मेरा मतलब है कि अगर मुझे अनुरोध की जरूरत नहीं है "if request.method == X"), तो क्या आप कृपया मुझे कुछ दस्तावेज़ों की ओर इशारा कर सकते हैं?
मार्टिन ब्लेक

3
POST और GET का टकराव Django के क्लास आधारित दृश्यों (1.3 में जोड़ा गया) पर लागू नहीं होता है, लेकिन मेरा मानना ​​है कि पहले रिलीज़ के लिए मान्य है।
ncoghlan

1
चेरीपी के बारे में उत्तर गलत है। डॉक्स से: "REST (प्रतिनिधि राज्य स्थानांतरण) एक स्थापत्य शैली है जो चेरीपी में कार्यान्वयन के लिए अच्छी तरह से अनुकूल है।" - docs.cherrypy.org/dev/progguide/REST.html
डेरेक

70

आश्चर्यचकित कोई भी उल्लेखित फ्लास्क नहीं

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

7
फ्लास्क वहाँ नहीं था जब सवाल पूछा गया था ...
मार्टिन ब्लेक

2
फ्लास्क पायथन 3.x के साथ काम नहीं करता है
15

3
फ्लास्क.देव अब अजगर 3
सीन विएरा

2
फ्लास्क 3.3 या उच्चतर पायथन का समर्थन करता है
mb21

3
यहाँ noob, यह कैसे एक RESTful है?
एवि ०

23

हम 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कार्यों सब बहुत समान हैं, जो थोड़ा कष्टप्रद हो सकता है। लेकिन यह पायथन है, इसलिए उन्हें कॉल करने योग्य वर्ग का हिस्सा बनाएं या मदद करने पर डेकोरेटर लिखें।


2
D = someUsefulThing की भयानक पुनरावृत्ति ... यहां तक ​​कि Django के लोग DRY का सुझाव देते हैं।
तिमोटो

5
@temoto: यदि y = someUsefulThing(...)एक "भयानक पुनरावृत्ति" है, तो सभी कार्यों और विधियों के सभी संदर्भ "भयानक" हैं। मैं यह समझने में विफल रहा कि किसी फ़ंक्शन को एक से अधिक बार संदर्भित करने से कैसे बचें ।
S.Lott

5
@temoto: "जब आपको तर्क बदलने की आवश्यकता होती है तो कुछ यूथफुलिंग को पास किया जाता है, एक मौका है कि कोई व्यक्ति सभी कॉल में ऐसा करना भूल जाए"? क्या? वह "भयानक" कैसे है? यह एक बार से अधिक एक समारोह को संदर्भित करने का एक तुच्छ परिणाम है। मैं यह समझने में असफल रहा हूं कि आप किस बारे में बात कर रहे हैं और यह अपरिहार्य है कि फ़ंक्शन संदर्भ "भयानक" कैसे है।
S.Lott

4
स्वीकृत उत्तर देखें। परिणाम अभिव्यक्ति {'संदेश': 'हैलो,' + नाम + '!'} सभी प्रस्तुतियों के लिए एक बार लिखा गया है।
तिमोटो

3
आपका HTMLView और jsonView फ़ंक्शन समान डेटा के लिए अलग-अलग प्रतिनिधित्व प्रदान करते हैं, है ना? तो someUsefulThing(request, object_id)एक डेटा पुनर्प्राप्ति अभिव्यक्ति है। अब आपके पास अपने कार्यक्रम में विभिन्न बिंदुओं पर एक ही अभिव्यक्ति की दो प्रतियां हैं। स्वीकृत उत्तर में, डेटा अभिव्यक्ति एक बार लिखी जाती है। अपने someUsefulThingकॉल को एक लंबे स्ट्रिंग के साथ बदलें , जैसे paginate(request, Post.objects.filter(deleted=False, owner=request.user).order_by('comment_count'))और कोड देखें। मुझे उम्मीद है कि यह मेरी बात को स्पष्ट करेगा।
टेम्पो


8

मुझे वास्तव में चेरीपी पसंद है । यहाँ एक आरामदायक वेब सेवा का एक उदाहरण दिया गया है:

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 आपके वेब ब्राउजर में प्रदर्शित होगा ।


35
यह एक अच्छा उदाहरण है, लेकिन इसके बारे में कुछ भी नहीं है।
ऐहलके

3
@Ahnfrieden: क्या आप यह स्पष्ट करके हम में से बाकी लोगों की मदद कर सकते हैं कि आपको क्यों नहीं लगता कि ऊपर वाला रेस्टफुल है? मेरे दृष्टिकोण से, यह REST के एक उत्कृष्ट उदाहरण की तरह दिखता है और किसी Restful प्रणाली के किसी भी नियम या बाधा को तोड़ने के लिए प्रकट नहीं होता है।
lilbyrdie

42
सरल शब्दों में, ऊपर चेरी उदाहरण क्या कर रहा है "HTTP कॉल करने योग्य" दूरस्थ प्रक्रियाओं के रूप में तरीकों को उजागर कर रहा है। वह आरपीसी है। यह पूरी तरह से "क्रिया" उन्मुख है। प्रतिष्ठित आर्किटेक्चर एक सर्वर द्वारा प्रबंधित संसाधनों पर ध्यान केंद्रित करते हैं और फिर उन संसाधनों पर बहुत सीमित संचालन की पेशकश करते हैं : विशेष रूप से, POST (बनाएँ), GET (पढ़ें), PUT (अपडेट) और DELETE (हटाएं)। इन संसाधनों का हेरफेर, विशेष रूप से पीयूटी के माध्यम से अपने राज्य को बदलने के लिए, मुख्य मार्ग है जिससे "सामान होता है"।
वीर पूर्वाह्न



8

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

मेरा व्यक्तिगत अनुभव, fwiw, यह है कि एक बार जब आपके पास एक आकार-फिट-सभी रूपरेखा होती है, तो आप इसके ORM, इसके प्लग इन आदि का उपयोग करना शुरू कर देंगे, क्योंकि यह आसान है, और कुछ ही समय में आपके पास निर्भरता खत्म हो जाएगी इससे छुटकारा पाना बहुत कठिन है।

एक वेब फ्रेमवर्क चुनना एक कठिन निर्णय है, और मैं केवल एक रीस्ट एपीआई को उजागर करने के लिए एक पूर्ण स्टैक समाधान चुनने से बचूंगा।

अब, अगर आपको वास्तव में Django का उपयोग करने की आवश्यकता है / चाहती है, तो पिस्टन django ऐप्स के लिए एक अच्छा REST फ्रेमवर्क है।

कहा जा रहा है कि, चेरीपी वास्तव में बहुत अच्छी लगती है, लेकिन REST की तुलना में अधिक RPC लगती है।

नमूनों को देखते हुए (मैंने इसका इस्तेमाल कभी नहीं किया), शायद वेबस्टार सबसे अच्छा और सबसे साफ है अगर आपको केवल REST की आवश्यकता है।


6

यहाँ REST पर CherryPy डॉक्स में एक चर्चा है: http://docs.cherrypy.org/dev/progguide/REST.html

विशेष रूप से यह चेरीडाई डिस्पैचर में निर्मित मेथडाइस्पैचर नामक एक उल्लेख का उल्लेख करता है, जो उनके HTTP-वर्ब आइडेंटिफ़ायर (GET, POST, आदि ...) के आधार पर तरीकों का आह्वान करता है।


6

2010 में, पिरामिड और repoze.bfg समुदायों ने पिरामिड बनाने के लिए "ज्वाइन की" , एक वेब फ्रेमवर्क जो कि सबसे भारी रूप से repoze.bfg पर आधारित है। यह अपने मूल ढांचे के दर्शन को बनाए रखता है, और इसका उपयोग रेस्टफुल सेवाओं के लिए किया जा सकता है । यह देखने लायक है।


पिरामिड के साथ आप कॉर्निस का उपयोग कर सकते हैं , जो आरईएसटी वेब सेवाओं के निर्माण और दस्तावेजीकरण के लिए उपयोगी सहायक प्रदान करता है।
केल्विन


5

लगता है कि अजगर वेब फ्रेमवर्क के सभी प्रकार अब 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)),
)

आधिकारिक साइट से उदाहरण लें, सभी उपरोक्त कोड एपीआई प्रदान करते हैं, स्व-व्याख्या किए गए दस्तावेज़ (जैसे साबुन आधारित वेबवर्क) और यहां तक ​​कि सैंडबॉक्स को थोड़ा सा परीक्षण करने के लिए। बहुत सुविधा है।

लिंक: http://django-rest-framework.org/


2
विशेष रूप से ब्राउज़ करने योग्य इंटरफ़ेस विकास करते समय बहुत समय बचा रहा है! कई अन्य फायदे, इसलिए बाकी कार्यान्वयन शुरू करने वाले सभी को एक नज़र रखना चाहिए। मैंने स्वादी के साथ शुरुआत की, लेकिन पूरी तरह से django-
rest-

3

मैं अजगर दुनिया का विशेषज्ञ नहीं हूं, लेकिन मैं django का उपयोग कर रहा हूं जो एक उत्कृष्ट वेब फ्रेमवर्क है और इसका उपयोग एक आरामदायक रूपरेखा बनाने के लिए किया जा सकता है।


3

web2py में आसानी से RESTful API का निर्माण करने के लिए समर्थन शामिल है, यहाँ और यहाँ वर्णित (वीडियो)। विशेष रूप से, उसे देखें parse_as_rest, जो आपको URL प्रतिमानों को परिभाषित करने देता है जो डेटाबेस अनुरोधों के लिए मानचित्र अनुरोधों को दर्शाता है; और smart_query, जो आपको URL में मनमाने प्राकृतिक भाषा के प्रश्नों को पास करने में सक्षम बनाता है।


उल्लिखित लिंक अब उपलब्ध नहीं हैं
milovanderlinden

लिंक अपडेट कर दिए गए हैं - फिर से प्रयास करें।
एंथोनी

2

मैं आप Django का उपयोग कर रहे हैं तो आप django-tastypie को django-piston के विकल्प के रूप में मान सकते हैं । पिस्टन की तुलना में गैर-ओआरएम डेटा स्रोतों को ट्यून करना आसान है, और इसमें महान दस्तावेज हैं


0

मैं दृढ़ता से टर्बो या बोतल की सलाह देता हूं:

TurboGears:

  • django की तुलना में कम क्रिया
  • अधिक लचीला, कम एचटीएमएल-उन्मुख
  • लेकिन: कम प्रसिद्ध

बोतल:

  • बहुत तेज़
  • सीखना बहुत आसान है
  • लेकिन: न्यूनतर और परिपक्व नहीं

0

हम कठोर REST सेवाओं के लिए एक रूपरेखा पर काम कर रहे हैं, http://prestans.googlecode.com देखें

फिलहाल इसके शुरुआती अल्फा में, हम mod_wsgi और Google के AppEngine के खिलाफ परीक्षण कर रहे हैं।

परीक्षकों और प्रतिक्रिया की तलाश में। धन्यवाद।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.