답변:
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_query
URL을 통해 임의의 자연어 쿼리를 전달할 수 있습니다.
엄격한 REST 서비스를위한 프레임 워크를 개발 중입니다. http://prestans.googlecode.com을 확인 하십시오.
초기 알파에서는 mod_wsgi와 Google의 AppEngine에 대해 테스트하고 있습니다.
테스터 및 피드백을 찾고 있습니다. 감사.