มีรายการแนะนำบางส่วนของกรอบงาน REST แบบ Python ที่แตกต่างกันสำหรับใช้บนเซิร์ฟเวอร์เพื่อเขียน RESTful API ของคุณเองหรือไม่? โดยเฉพาะอย่างยิ่งกับข้อดีและข้อเสีย
โปรดเพิ่มคำแนะนำได้ที่นี่ :)
มีรายการแนะนำบางส่วนของกรอบงาน REST แบบ Python ที่แตกต่างกันสำหรับใช้บนเซิร์ฟเวอร์เพื่อเขียน RESTful API ของคุณเองหรือไม่? โดยเฉพาะอย่างยิ่งกับข้อดีและข้อเสีย
โปรดเพิ่มคำแนะนำได้ที่นี่ :)
คำตอบ:
สิ่งที่ต้องระวังในการออกแบบ RESTful API คือการรวม GET และ POST ราวกับว่ามันเป็นสิ่งเดียวกัน เป็นเรื่องง่ายที่จะทำผิดพลาดด้วยมุมมองที่อิงกับฟังก์ชั่นของDjangoและโปรแกรมมอบหมายงานเริ่มต้นของCherryPyแม้ว่ากรอบงานทั้งสองจะให้วิธีแก้ไขปัญหานี้ ( มุมมองระดับคลาสและMethodDispatcherตามลำดับ)
ใช้ HTTP คำกริยามีความสำคัญมากในส่วนที่เหลือและถ้าคุณระมัดระวังเป็นอย่างมากเกี่ยวกับเรื่องนี้คุณจะจบลงตกอยู่ในส่วนที่เหลือต่อต้านรูปแบบ
กรอบบางอย่างที่จะได้รับมันขวาweb.py , ขวดและขวด เมื่อรวมกับไลบรารีmimerender (การเปิดเผยอย่างสมบูรณ์: ฉันเขียนไว้) พวกเขาอนุญาตให้คุณเขียนเว็บเซอร์ RESTful ที่ดี:
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!
อัปเดต (เมษายน 2555) : เพิ่มข้อมูลเกี่ยวกับมุมมองระดับพื้นฐานของ Django, CherryPy's MethodDispatcher และกรอบขวดและขวด ไม่มีอยู่เมื่อถามคำถาม
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
เรากำลังใช้Djangoสำหรับบริการบนเว็บที่สงบ
โปรดทราบว่า - ออกจากกล่อง - Django ไม่มีการรับรองความถูกต้องอย่างละเอียดสำหรับความต้องการของเรา เราใช้ส่วนต่อประสาน Django-RESTซึ่งช่วยได้มาก [เรารีดมาตั้งแต่เราเองเพราะเราทำส่วนขยายมากมายจนกลายเป็นฝันร้ายในการบำรุงรักษา]
เรามี URL สองประเภท ได้แก่ : "html" URL ที่ใช้หน้า HTML ที่มุ่งเน้นมนุษย์และ URL "json" ซึ่งใช้การประมวลผลเชิงบริการเว็บ ฟังก์ชันมุมมองของเรามักจะมีลักษณะเช่นนี้
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
ฟังก์ชั่นที่มีอยู่ทั้งหมดที่คล้ายกันมากซึ่งสามารถเป็นบิตที่น่ารำคาญ แต่มันเป็น Python ดังนั้นให้พวกมันเป็นส่วนหนึ่งของคลาส callable หรือเขียนมัณฑนากรถ้ามันช่วยได้
y = someUsefulThing(...)
เป็น "การทำซ้ำอันยิ่งใหญ่" การอ้างอิงทั้งหมดไปยังฟังก์ชั่นและวิธีการทั้งหมดคือ "อันยิ่งใหญ่" ฉันไม่เข้าใจวิธีการอ้างอิงฟังก์ชันมากกว่าหนึ่งครั้ง
someUsefulThing(request, object_id)
การแสดงออกของการดึงข้อมูลคือ ตอนนี้คุณมีนิพจน์เดียวกันสองชุดในจุดที่ต่างกันในโปรแกรมของคุณ ในคำตอบที่ยอมรับการแสดงออกของข้อมูลจะถูกเขียนเพียงครั้งเดียว แทนที่someUsefulThing
สายของคุณด้วยสายยาวเช่นpaginate(request, Post.objects.filter(deleted=False, owner=request.user).order_by('comment_count'))
และดูรหัส ฉันหวังว่ามันจะแสดงให้เห็นถึงจุดของฉัน
ดูวิกิพีเดียPython Web Frameworks
คุณอาจไม่ต้องการเฟรมเวิร์กสแต็กเต็มรูปแบบแต่รายการที่เหลือยังคงค่อนข้างยาว
ผมชอบCherryPy นี่คือตัวอย่างของการบริการเว็บสงบ:
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())
สิ่งนี้เน้นสิ่งที่ฉันชอบเกี่ยวกับ CherryPy; นี่เป็นตัวอย่างการทำงานที่สมบูรณ์ซึ่งสามารถเข้าใจได้แม้กับคนที่ไม่ทราบกรอบ หากคุณเรียกใช้รหัสนี้คุณจะเห็นผลลัพธ์ในเว็บเบราว์เซอร์ของคุณทันที เช่นไปที่http: // localhost: 8080 / celc_to_fahr? degrees = 50จะแสดง122.0
ในเว็บเบราว์เซอร์ของคุณ
ลองดูที่
ฉันไม่เห็นเหตุผลใด ๆ ที่จะใช้ Django เพื่อเปิดเผย REST api มีโซลูชันที่เบาและยืดหยุ่นกว่า Django นำของอื่น ๆ มาวางบนโต๊ะซึ่งไม่จำเป็นเสมอไป แน่นอนว่าไม่จำเป็นหากคุณต้องการเปิดเผยรหัสบางส่วนเป็นบริการ REST
ประสบการณ์ส่วนตัวของฉัน fwiw คือเมื่อคุณมีกรอบขนาดเดียวที่เหมาะกับทุกคนคุณจะเริ่มใช้ ORM ปลั๊กอินของมันและอื่น ๆ เพียงเพราะมันง่ายและในเวลาไม่นานที่คุณต้องพึ่งพา มันยากมากที่จะกำจัด
การเลือกเฟรมเวิร์กของเว็บเป็นการตัดสินใจที่ยากลำบากและฉันจะหลีกเลี่ยงการเลือกโซลูชันสแต็กเต็มรูปแบบเพื่อเปิดเผย REST api
ตอนนี้ถ้าคุณต้องการ / ต้องการใช้ Django จริงๆแล้ว Piston เป็นเฟรมเวิร์ค REST ที่ดีสำหรับแอพ django
ที่ถูกกล่าวว่า CherryPy ดูดีเช่นกัน แต่ดูเหมือน RPC มากกว่า REST
ดูตัวอย่าง (ฉันไม่เคยใช้) อาจจะเป็น web.py ที่ดีที่สุดและสะอาดที่สุดหากคุณต้องการ REST
นี่คือการสนทนาใน CherryPy docs บน REST: http://docs.cherrypy.org/dev/progguide/REST.html
โดยเฉพาะอย่างยิ่งมันกล่าวถึงการสร้างขึ้นใน CherryPy ดิสแพตเชอร์เรียกว่า
ในปี 2010 ชุมชน Pylons และ repoze.bfg "เข้าร่วมกับกองกำลัง" เพื่อสร้างพีระมิดซึ่งเป็นเฟรมเวิร์กเว็บที่อิงกับ repoze.bfg เป็นส่วนใหญ่ จะยังคงปรัชญากรอบพ่อแม่ของตนและสามารถนำมาใช้สำหรับบริการสงบ มันคุ้มค่าที่จะดู
Pistonเป็นเฟรมเวิร์กที่มีความยืดหยุ่นสูงสำหรับการใช้ RESTful APIs สำหรับแอ็พพลิเคชัน Django
ดูเหมือนว่ากรอบงานเว็บหลามทุกประเภทสามารถนำอินเตอร์เฟส RESTful ไปใช้ได้ทันที
สำหรับ Django นอกเหนือจาก Deliciouspie และลูกสูบแล้ว django-rest-framework เป็นสิ่งที่ควรค่าแก่การพูดถึง ฉันได้โยกย้ายหนึ่งในโครงการของฉันไปอย่างราบรื่น
Django REST framework เป็นเฟรมเวิร์ค REST ที่มีน้ำหนักเบาสำหรับ Django ซึ่งมีจุดประสงค์เพื่อให้ง่ายต่อการสร้าง 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)),
)
นำตัวอย่างจากเว็บไซต์อย่างเป็นทางการรหัสข้างต้นทั้งหมดให้ api เอกสารอธิบายตนเอง (เช่น webservice สบู่ตาม) และแม้กระทั่ง sandbox เพื่อทดสอบเล็กน้อย สะดวกสบายมาก ๆ
ฉันไม่ได้เป็นผู้เชี่ยวชาญในโลกหลาม แต่ฉันใช้djangoซึ่งเป็นกรอบงานเว็บที่ยอดเยี่ยมและสามารถใช้เพื่อสร้างกรอบงานที่เงียบสงบ
web2pyรวมถึงการสนับสนุนการสร้าง RESTful API อย่างง่ายดายซึ่งอธิบายไว้ที่นี่และที่นี่ (วิดีโอ) โดยเฉพาะอย่างยิ่งดูที่parse_as_rest
ช่วยให้คุณกำหนดรูปแบบ URL ที่ร้องขอแผนที่ args กับแบบสอบถามฐานข้อมูล; และsmart_query
ซึ่งช่วยให้คุณสามารถส่งคำสั่งภาษาธรรมชาติโดยพลการใน URL
ฉันคุณกำลังใช้ Django แล้วคุณสามารถพิจารณาDjango-tastypieเป็นทางเลือกให้กับDjango ลูกสูบ มันเป็นเรื่องง่ายที่จะปรับแต่งไปยังแหล่งข้อมูลที่ไม่ใช่ออมกว่าลูกสูบและมีดีเอกสาร
ฉันขอแนะนำ TurboGears หรือขวด:
TurboGears:
ขวด:
เรากำลังทำงานบนเฟรมเวิร์กสำหรับบริการ REST ที่เข้มงวดลองดูhttp://prestans.googlecode.com
ในช่วงต้นอัลฟ่าในขณะนี้เรากำลังทดสอบกับ mod_wsgi และ AppEngine ของ Google
กำลังมองหาผู้ทดสอบและข้อเสนอแนะ ขอบคุณ