[python] Python REST (웹 서비스) 프레임 워크의 권장 사항 [닫은]
서버 측에서 고유 한 RESTful API를 작성하기 위해 사용할 수있는 다른 Python 기반 REST 프레임 워크의 권장 사항 목록이 있습니까? 바람직하게는 장단점이 있습니다.
여기에 추천을 추가하십시오. 🙂
답변
RESTful API를 설계 할 때주의해야 할 사항은 마치 GET과 POST가 동일한 것처럼 보입니다. Django 의 함수 기반 뷰 와 CherryPy 의 기본 디스패처 를 사용하여 실수를 저지르는 것은 쉽지만 두 프레임 워크 모두 이제이 문제를 해결할 수있는 방법을 제공합니다 (각각 클래스 기반 뷰 및 MethodDispatcher ).
HTTP 동사는 REST에서 매우 중요 하며, 이에 대해주의하지 않으면 REST anti-pattern에 빠지게됩니다 .
올바른 프레임 워크는 web.py , Flask 및 Bottle 입니다. 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!
업데이트 (2012 년 4 월) : Django의 클래스 기반 뷰, CherryPy의 MethodDispatcher 및 Flask and Bottle 프레임 워크에 대한 정보가 추가되었습니다. 질문을 받았을 때도 존재하지 않았습니다.
답변
아무도 플라스크를 언급하지 않았다 .
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
답변
RESTful 웹 서비스에 Django 를 사용하고 있습니다.
Django는 우리의 요구에 맞는 충분한 인증을 가지고 있지 않습니다. 우리는 Django-REST 인터페이스 를 사용했는데 많은 도움이되었습니다. [그 이후로 많은 확장 작업을 수행하여 유지 관리의 악몽이 되었기 때문에 자체적으로 롤업했습니다.]
인간 지향적 HTML 페이지를 구현하는 “html”URL과 웹 서비스 지향 처리를 구현하는 “json”URL의 두 가지 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
기능은 약간 성가신 될 수있는 모든 매우 유사합니다. 그러나 그것은 파이썬이므로 호출 가능한 클래스의 일부로 만들거나 도움이된다면 데코레이터를 작성하십시오.
답변
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 서비스로 노출하려는 경우에는 필요하지 않습니다.
내 개인적인 경험은, 당신이 하나의 크기에 맞는 모든 프레임 워크를 갖게되면 ORM, 플러그인 등을 사용하기 시작하기 쉽다는 것입니다. 그것은 제거하기가 매우 어렵습니다.
웹 프레임 워크를 선택하는 것은 어려운 결정이며 REST API를 노출하기 위해 풀 스택 솔루션을 선택하지 않는 것이 좋습니다.
Django를 사용해야 할 필요가 있다면 Piston은 django 앱을위한 훌륭한 REST 프레임 워크입니다.
CherryPy는 정말 멋지지만 REST보다 RPC가 더 많은 것 같습니다.
샘플을 보았을 때 (필자는 사용하지 않았 음) REST 만 필요한 경우 web.py가 가장 좋고 깨끗합니다.