পাইথন আরইএসটি (ওয়েব পরিষেবাদি) কাঠামোর প্রস্তাবনাগুলি? [বন্ধ]


321

সার্ভারসাইডে নিজের নিজস্ব RESTful API গুলি লিখতে ব্যবহার করার জন্য পাইথন ভিত্তিক আরএসটি ফ্রেমওয়ার্কের বিভিন্ন সুপারিশের কোথাও একটি তালিকা আছে? অগ্রাধিকার হিসাবে ভাল এবং কনস সঙ্গে।

এখানে সুপারিশ যুক্ত করতে নির্দ্বিধায় দয়া করে। :)


উত্তর:


192

একটি RESTful এপিআই ডিজাইন করার সময় যত্নবান হওয়ার কিছু হ'ল জিইটি এবং পোস্টের সংমিশ্রণ, যেন তারা একই জিনিস as এটা তোলে সঙ্গে এই ভুল করা খুবই সহজ জ্যাঙ্গো 'র ফাংশন-ভিত্তিক মতামত এবং CherryPy ,' ডিফল্ট ডেস্প্যাচার যদিও উভয় অবকাঠামো এখন এই সমস্যা এড়াতে একটি উপায় (প্রদান শ্রেণী ভিত্তিক মতামত এবং MethodDispatcher যথাক্রমে)।

REST- এ HTTP- ক্রিয়াগুলি অত্যন্ত গুরুত্বপূর্ণ এবং আপনি যদি এ সম্পর্কে খুব যত্নশীল না হন তবে আপনি একটি 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!

আপডেট (এপ্রিল ২০১২) : জ্যাঙ্গোর ক্লাস-ভিত্তিক মতামত, চেরিপাইয়ের মেথডিসপাচার এবং ফ্লাস্ক এবং বোতল ফ্রেমওয়ার্ক সম্পর্কিত তথ্য যুক্ত করা হয়েছে। যখন প্রশ্ন জিজ্ঞাসা করা হয়েছিল তখনও ফিরে ছিল না।


12
এটি ভুল, জঙ্গো পোষ্ট বনাম জিইটি স্বীকৃতি এবং শুধুমাত্র কয়েকটি নির্দিষ্ট পদ্ধতিতে ভিউ সীমাবদ্ধ করার জন্য সম্পূর্ণ সমর্থন রয়েছে।
এহেলকে

20
আমি বলতে চাইছিলাম, ডিফল্টরূপে, জ্যাঙ্গো পোষ্ট এবং জিইটি-কে একই জিনিস হিসাবে দেখায়, যা আপনি অসুবিধাগ্রস্থ হন যখন আপনি রিস্টফুল পরিষেবাগুলি করতে বাধ্য করেন: যদি অনুরোধ.মোথড == 'জিইটি': ডু_সামিং () এলিফ রিকোয়েস্ট.মোথডো == 'পোস্ট': do_something_else () ওয়েব.পি-তে সমস্যা নেই
মার্টিন ব্লেক

19
@ ওয়াহনফ্রিডেন: জ্যাঙ্গোতে আলাদা আলাদা এইচটিটিপি ক্রিয়াগুলি পৃথকভাবে পরিচালনা করার জন্য যদি দেশীয় সমর্থন থাকে ("দেশীয়" মানে আমার প্রয়োজনের প্রয়োজন হয় না যদি অনুরোধ।মোথাল == এক্স "), আপনি কি দয়া করে আমাকে কিছু ডকুমেন্টেশনে নির্দেশ করতে পারেন?
মার্টিন ব্লেক

3
পোস্ত এবং জিইটি-র সংমিশ্রণ জাঙ্গোর ক্লাস বেইজ ভিউগুলিতে প্রযোজ্য না (১.৩-এ যুক্ত হয়েছে) তবে আমি বিশ্বাস করি যে পূর্ববর্তী প্রকাশের জন্য বৈধ is
ncoghlan

1
চেরিপাই সম্পর্কে উত্তর ভুল। দস্তাবেজ থেকে: "আরইএসটি (প্রতিনিধিত্বমূলক রাজ্য স্থানান্তর) একটি স্থাপত্য শৈলী যা চেরিপাইতে প্রয়োগের পক্ষে বেশ উপযুক্ত" " - docs.cherrypy.org/dev/pogguide/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 এর সাথে কাজ করে না
bitek

3
ফ্লাস্ক.দেব এখন পাইথন 3
শান

2
ফ্লাস্ক পাইথন ৩.৩ বা তারও বেশি সমর্থন করে
mb21

3
এখানে নুব, এটি কীভাবে বিশ্রামের?
এভিআই

23

আমরা রিস্টুল ওয়েব সার্ভিসের জন্য জ্যাঙ্গো ব্যবহার করছি ।

নোট করুন - বাক্সের বাইরে - জ্যাঙ্গোতে আমাদের প্রয়োজনের জন্য যথেষ্ট পরিমাণে প্রমাণীকরণ ছিল না। আমরা জ্যাঙ্গো-আরইএসটি ইন্টারফেস ব্যবহার করেছি , যা অনেক সাহায্য করেছিল। [এর পরে আমরা আমাদের নিজস্ব ঘূর্ণিত করেছি কারণ আমরা এতগুলি এক্সটেনশান করেছি যে এটি রক্ষণাবেক্ষণের দুঃস্বপ্ন হয়ে গেছে]]

আমাদের দুটি ধরণের ইউআরএল রয়েছে: "এইচটিএমএল" ইউআরএল যা মানব-ভিত্তিক এইচটিএমএল পৃষ্ঠাগুলি বাস্তবায়ন করে এবং "জসন" ইউআরএল যা ওয়েব-পরিষেবা ভিত্তিক প্রক্রিয়াকরণ বাস্তবায়ন করে। আমাদের দর্শন ফাংশন প্রায়শই এটির মতো দেখায়।

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

মূল কার্যকারিতা দুটি উপস্থাপনা থেকে সক্রিয় করা হয়। জেএসওএন উপস্থাপনাটি সাধারণত কেবলমাত্র একটি অবজেক্ট যা অনুরোধ করা হয়েছিল। এইচটিএমএল উপস্থাপনাটিতে প্রায়শই সব ধরণের নেভিগেশন এইড এবং অন্যান্য প্রাসঙ্গিক ক্লু অন্তর্ভুক্ত থাকে যা মানুষকে উত্পাদনশীল হতে সহায়তা করে।

jsonViewফাংশন সব অনুরূপ, যা একটি বিট বিরক্তিকর হতে পারে। তবে এটি পাইথন, সুতরাং তাদেরকে কলযোগ্য শ্রেণীর অংশ করুন বা সজ্জা লিখুন যদি এটি সাহায্য করে।


2
ডি = এর কিছু উপকারী পুনরায় পুনরায় পুনরুক্তি ... এমনকি জাজানো ছেলেরাও DRY পরামর্শ দেয়।
temoto

5
@ আইটিমোটো: যদি y = someUsefulThing(...)একটি "ভয়ঙ্কর পুনরাবৃত্তি" হয়, তবে সমস্ত ফাংশন এবং পদ্ধতির সমস্ত উল্লেখ "ভয়ঙ্কর"। কোনও ফাংশনকে একাধিকবার কীভাবে উল্লেখ করা যায় তা এড়াতে আমি ব্যর্থ হয়েছি ।
এস.লট

5
@ আইটোটো: "যখন আপনাকে কিছু ইউসফুল থিংয়ে পাস হওয়া যুক্তিগুলি পরিবর্তন করতে হবে, তখন এমন কোনও সুযোগ আছে যে কোনও ব্যক্তি সমস্ত কলগুলিতে এটি করতে ভুলে যায়"? কি? কীভাবে এই "ভয়ঙ্কর"? এটি একটি ফাংশনকে একাধিকবার উল্লেখ করার ক্ষেত্রে একটি তুচ্ছ ফলাফল। আপনি কী বিষয়ে কথা বলছেন এবং ফাংশন উল্লেখটি কীভাবে অনিবার্য since
এস .লট

4
গৃহীত উত্তর দেখুন। ফলাফল প্রকাশ {'বার্তা': 'হ্যালো,' + নাম + '!' All সমস্ত উপস্থাপনার জন্য একবারে লেখা হয়।
temoto

3
আপনার এইচটিএমএলভিউ এবং জসনভিউ ফাংশনগুলি একই ডেটার জন্য বিভিন্ন উপস্থাপনা দেয়, তাই না? সুতরাং 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: // লোকালহোস্ট: 8080 / celc_to_fahr? ডিগ্রি = 50 পরিদর্শন 122.0করা আপনার ওয়েব ব্রাউজারে প্রদর্শিত হবে ।


35
এটি একটি দুর্দান্ত উদাহরণ, তবে এটি সম্পর্কে বিশ্রামের কিছুই নেই।
এহেলকে

3
@ ওয়াহনফ্রিডেন: আপনি উপরের বিশ্রামটি কেন ভাবেন না বলে পরিষ্কার করে আপনি আমাদের বাকী সবাইকে সাহায্য করতে পারেন? আমার দৃষ্টিকোণ থেকে, এটি আরএএসটি-এর একটি ক্লাসিক উদাহরণের মতো দেখায় এবং কোনও রেস্ট্রিকাল সিস্টেমের কোনও নিয়ম বা সীমাবদ্ধতা ভঙ্গ করে না।
lilbyrdie

42
সহজ কথায়, উপরের চেরিপাই উদাহরণটি যা করছে তা হ'ল "এইচটিটিপি কলযোগ্য" দূরবর্তী প্রক্রিয়া হিসাবে পদ্ধতিগুলি উদ্ভাসিত। এটি আরপিসি। এটি সম্পূর্ণরূপে "ক্রিয়াপদ" ভিত্তিক। RESTful আর্কিটেকচারগুলি কোনও সার্ভার দ্বারা পরিচালিত সংস্থানগুলিতে ফোকাস করে এবং তারপরে সেই সংস্থানগুলিতে খুব সীমিত ক্রিয়াকলাপ সরবরাহ করে: বিশেষত, পোস্ট (তৈরি করুন), জিইটি (পঠন), পুট (আপডেট) এবং মোছা (মুছুন)। এই সংস্থাগুলির হেরফেরগুলি বিশেষত PUT এর মাধ্যমে তাদের রাষ্ট্র পরিবর্তন করা মূল পথ যা "স্টাফগুলি ঘটে"।
ভার্ভেগুয়ে



8

আমি কেবল একটি REST এপিআই প্রকাশের জন্য জ্যাঙ্গো ব্যবহার করার কোনও কারণ দেখছি না, আরও হালকা এবং আরও নমনীয় সমাধান রয়েছে। জাজানো টেবিলে প্রচুর অন্যান্য জিনিস বহন করে, যা সর্বদা প্রয়োজন হয় না। আপনি যদি কেবলমাত্র একটি আরএসটি পরিষেবা হিসাবে কিছু কোড প্রকাশ করতে চান তবে অবশ্যই এটির প্রয়োজন নেই।

আমার ব্যক্তিগত অভিজ্ঞতা, নতুন, আপনি একবার এক-আকারের ফিট সমস্ত কাঠামো পরে, আপনি এটি সহজ কারণ এটি এর ওআরএম, তার প্লাগইন, ইত্যাদি ব্যবহার শুরু করতে পারেন, এবং কোন সময় আপনি একটি নির্ভরতা থাকার শেষ না এ থেকে মুক্তি পাওয়া খুব কঠিন hard

ওয়েব কাঠামো নির্বাচন করা একটি কঠিন সিদ্ধান্ত, এবং আমি কেবলমাত্র একটি REST এপিআই প্রকাশ করার জন্য একটি সম্পূর্ণ স্ট্যাক সমাধান বেছে নেওয়া এড়াতে পারি।

এখন, আপনার যদি সত্যই জ্যাঙ্গোটি প্রয়োজন / ব্যবহার করতে চান, তবে পিস্তন জ্যাঙ্গো অ্যাপ্লিকেশনগুলির জন্য একটি দুর্দান্ত REST কাঠামো।

বলা হচ্ছে, চেরিপাই দেখতে খুব সুন্দর লাগছে, তবে আরআরএসটি-র চেয়ে আরও বেশি আরপিসি বলে মনে হচ্ছে।

নমুনাগুলি দেখে (আমি এটি কখনই ব্যবহার করি নি), সম্ভবত আপনার যদি কেবল বিশ্রামের প্রয়োজন হয় তবে ওয়েব.পিই সবচেয়ে ভাল এবং পরিষ্কার est


6

এখানে REST- তে চেরিপি ডক্সে একটি আলোচনা রয়েছে: http://docs.cherrypy.org/dev/progguide/REST.html

বিশেষত এটি মেথডিডিসপ্যাচার নামে পরিচিত চেরিপি প্রেরণকারীতে একটি বিল্টের উল্লেখ করেছে, যা তাদের এইচটিটিপি-ক্রিয়া শনাক্তকারীদের (জিইটি, পোস্ট, ইত্যাদি ...) উপর ভিত্তি করে পদ্ধতিগুলি আহ্বান করে।


6

২০১০ সালে পাইপানস এবং রেপোজ.বিএফজি সম্প্রদায়গুলি পিরামিড তৈরি করতে "বাহিনীতে যোগ দিয়েছিল" যা একটি ওয়েব ফ্রেম ফ্রেম সবচেয়ে বেশি ভিত্তি করে রেপোজ.বিএফজি-র উপর ভিত্তি করে। এটি এর মূল ফ্রেমওয়ার্কগুলির দর্শনগুলি ধরে রাখে, এবং রেস্টস্টুল পরিষেবাগুলির জন্য ব্যবহার করা যেতে পারে । এটি এক নজর মূল্যবান।


পিরামিডের সাহায্যে আপনি কর্নিস ব্যবহার করতে পারেন যা REST ওয়েব পরিষেবাদি তৈরি এবং ডকুমেন্ট করার জন্য দরকারী সহায়ক সরবরাহ করে।
ক্যালভিন

5

পিস্টন জ্যাঙ্গো অ্যাপ্লিকেশনের জন্য RESTful API গুলি wirting জন্য খুবই নমনীয় কাঠামো নেই।


5

মনে হচ্ছে সমস্ত ধরণের পাইথন ওয়েব ফ্রেমওয়ার্কগুলি এখনই RESTful ইন্টারফেস প্রয়োগ করতে পারে।

জ্যাঙ্গোর জন্য, টেস্টিপি এবং পিস্টন ছাড়াও, জাঙ্গো-বিশ্রাম-কাঠামোটি উল্লেখযোগ্য একটি প্রতিশ্রুতিবদ্ধ। আমি ইতিমধ্যে এটিতে আমার প্রকল্পের একটি মাইগ্রেশন করেছি।

জ্যাঙ্গো আরইএসটি ফ্রেমওয়ার্ক হ'ল জ্যাঙ্গোর জন্য একটি হালকা ওআরইএসইএস কাঠামো, যার লক্ষ্য এটি ভাল-সংযুক্ত, স্ব-বর্ণনামূলক আরএসটিফুল ওয়েব এপিআইগুলি তৈরি করা সহজ করে তোলে।

দ্রুত উদাহরণ:

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
বিশেষত ব্রাউজযোগ্য ইন্টারফেসটি বিকাশের সময় অনেক সময় সাশ্রয় করছে! অন্যান্য অনেক সুবিধা, তাই বিশ্রাম বাস্তবায়ন শুরু করা প্রত্যেকের নজর থাকা উচিত। আমি টেস্টিপি দিয়ে শুরু করেছিলাম, তবে সম্পূর্ণ জাজানো-রেস্ট-ফ্রেমওয়ার্কে স্যুইচ করেছি
michel.iamit

3

আমি পাইথন জগতের বিশেষজ্ঞ নই তবে আমি জ্যাঙ্গো ব্যবহার করছি যা একটি দুর্দান্ত ওয়েব কাঠামো এবং একটি বিশ্রাম কাঠামো তৈরি করতে ব্যবহার করা যেতে পারে।


3

ওয়েব টুপি এখানে এবং এখানে বর্ণিত (ভিডিও) সহজেই RESTful এপিআই তৈরির জন্য সমর্থন অন্তর্ভুক্ত করে । বিশেষত, দেখুন parse_as_rest, যা আপনাকে ইউআরএল নিদর্শনগুলি সংজ্ঞায়িত করতে দেয় যা ম্যাপের অনুরোধটি ডাটাবেস প্রশ্নগুলিতে আরোগুলি দেয়; এবং smart_query, যা আপনাকে URL এ স্বেচ্ছাসেবী প্রাকৃতিক ভাষা কোয়েরি করতে সক্ষম করে।


উল্লিখিত লিঙ্কগুলি আর উপলভ্য নয়
মিলোভেন্ডারলিডেন

লিঙ্কগুলি আপডেট হয়েছে - আবার চেষ্টা করুন।
অ্যান্টনি

2

আমি তোমাদের জ্যাঙ্গো ব্যবহার করছেন তারপর আপনি বিবেচনা করতে পারেন জ্যাঙ্গো-tastypie বিকল্প হিসেবে জ্যাঙ্গো-পিস্টন । পিস্টনের চেয়ে অ-ওআরএম ডেটা উত্সগুলিতে টিউন করা সহজ, এবং দুর্দান্ত ডকুমেন্টেশন রয়েছে


0

আমি দৃ strongly়ভাবে টার্বো জিয়ারস বা বোতলটি সুপারিশ করছি:

TurboGears:

  • জ্যাঙ্গোর চেয়ে কম ভার্বোস
  • আরও নমনীয়, কম এইচটিএমএল-ভিত্তিক
  • তবে: কম বিখ্যাত

রহমান:

  • খুব দ্রুত
  • শিখতে খুব সহজ
  • তবে: স্বল্প ও পরিপক্ক নয়

0

আমরা কঠোর REST পরিষেবাদির জন্য একটি ফ্রেমওয়ার্কে কাজ করছি, http://prestans.googlecode.com দেখুন

মুহুর্তে এটি আলফার প্রথম দিকে, আমরা মোড_উজি এবং গুগলের অ্যাপজিনির বিরুদ্ধে পরীক্ষা করছি।

পরীক্ষক এবং প্রতিক্রিয়া খুঁজছেন। ধন্যবাদ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.