답변:
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기능은 약간 성가신 될 수있는 모든 매우 유사합니다. 그러나 그것은 파이썬이므로 호출 가능한 클래스의 일부로 만들거나 도움이된다면 데코레이터를 작성하십시오.
y = someUsefulThing(...)"끔찍한 반복"인 경우 모든 함수와 메소드에 대한 모든 참조는 "awful"입니다. 함수를 두 번 이상 참조 하지 않는 방법을 이해하지 못했습니다 .
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 서비스로 노출하려는 경우에는 필요하지 않습니다.
내 개인적인 경험은, 당신이 하나의 크기에 맞는 모든 프레임 워크를 갖게되면 ORM, 플러그인 등을 사용하기 시작하기 쉽다는 것입니다. 그것은 제거하기가 매우 어렵습니다.
웹 프레임 워크를 선택하는 것은 어려운 결정이며 REST API를 노출하기 위해 풀 스택 솔루션을 선택하지 않는 것이 좋습니다.
Django를 사용해야 할 필요가 있다면 Piston은 django 앱을위한 훌륭한 REST 프레임 워크입니다.
CherryPy는 정말 멋지지만 REST보다 RPC가 더 많은 것 같습니다.
샘플을 보았을 때 (필자는 사용하지 않았 음) REST 만 필요한 경우 web.py가 가장 좋고 깨끗합니다.
다음은 REST의 CherryPy 문서에 대한 토론입니다. http://docs.cherrypy.org/dev/progguide/REST.html
특히 MethodDispatcher라는 CherryPy 디스패처가 내장되어 있는데, 이는 HTTP 동사 식별자 (GET, POST 등)를 기반으로 메소드를 호출합니다.
모든 종류의 파이썬 웹 프레임 워크가 RESTful 인터페이스를 구현할 수있는 것으로 보입니다.
Django의 경우 tastypie와 피스톤 외에도 장고 레스트 프레임 워크는 언급 할 가치가 있습니다. 이미 프로젝트 중 하나를 원활하게 마이그레이션했습니다.
Django REST 프레임 워크는 Django를위한 간단한 REST 프레임 워크로서, 잘 연결되고 자체 설명이 가능한 RESTful 웹 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, 자체 설명 문서 (비누 기반 웹 서비스와 같은) 및 심지어 샌드 박스를 제공하여 비트를 테스트합니다. 매우 편리합니다.
web2py 에는 여기 및 여기에 설명 된 RESTful API를 쉽게 빌드 할 수있는 지원이 포함되어 있습니다 (비디오). 특히을 보면 parse_as_rest요청 인수를 데이터베이스 쿼리에 매핑하는 URL 패턴을 정의 할 수 있습니다. 및 smart_queryURL을 통해 임의의 자연어 쿼리를 전달할 수 있습니다.
엄격한 REST 서비스를위한 프레임 워크를 개발 중입니다. http://prestans.googlecode.com을 확인 하십시오.
초기 알파에서는 mod_wsgi와 Google의 AppEngine에 대해 테스트하고 있습니다.
테스터 및 피드백을 찾고 있습니다. 감사.