Python REST(웹 서비스) 프레임워크 권장 사항
서버사이드에서 자신의 RESTful API를 작성하기 위해 사용하는 다양한 Python 기반 REST 프레임워크의 추천 목록이 어딘가에 있습니까?찬반양론이 있는 게 더 좋습니다.
여기에 자유롭게 추천을 추가해 주세요.:)
RESTful API를 설계할 때 주의해야 할 점은 GET과 POST의 조합입니다.이것들은 같은 것입니다.Django의 함수 기반 뷰와 CherryPy의 디폴트 디스패처에서는 이 오류가 발생하기 쉽습니다.다만, 현재는, 양쪽의 프레임워크가 이 문제를 회피하는 방법을 제공하고 있습니다(각각 클래스 베이스 뷰와 Method Dispatcher).
HTTP 속담은 REST에서 매우 중요하기 때문에 주의하지 않으면 REST 안티패턴에 빠질 수 있습니다.
올바른 프레임워크로는 web.py, Flask, Bottle 등이 있습니다.마임렌더 라이브러리와 결합할 경우(전체 공개:제가 작성했습니다)를 사용하면 RESTful Webservices를 작성할 수 있습니다.
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()
서비스의 로직은 한 번만 구현되며 올바른 표현 선택(Accept header) + 적절한 렌더링 기능(또는 템플릿)으로의 디스패치는 깔끔하고 투명한 방식으로 수행됩니다.
$ 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의 Method Dispatcher 및 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-REST 인터페이스를 사용하여 많은 도움이 되었습니다.[그 후 너무 많은 연장을 했기 때문에 유지보수의 악몽이 되어 버렸습니다.
두 종류의 URL이 있습니다.인간 지향 HTML 페이지를 구현하는 "html" URL과 웹 서비스 지향 처리를 구현하는 "json" 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이기 때문에 호출 가능한 클래스에 포함시키거나 도움이 된다면 데코레이터를 쓰세요.
Python Web Frameworks wiki를 참조하십시오.
전체 스택 프레임워크는 필요하지 않지만 나머지 목록은 여전히 상당히 깁니다.
체리파이를 정말 좋아해요.다음은 안심할 수 있는 웹 서비스의 예입니다.
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())
이것은 Cherry Py에 대해 제가 정말 좋아하는 점을 강조합니다.이것은 틀을 모르는 사람도 이해할 수 있는 완전히 유효한 예입니다.이 코드를 실행하면 웹 브라우저에서 결과를 즉시 볼 수 있습니다. 예를 들어, visiting http://localhost:8080/celc_to_substr=50이 표시됩니다.122.0
를 선택합니다.
을 보다.
REST API를 공개하기 위해 Django를 사용할 이유는 없습니다.경량하고 유연한 솔루션이 있습니다.장고는 항상 필요하지는 않은 많은 다른 것들을 테이블로 옮긴다.REST 서비스로 일부 코드만 노출하려는 경우에는 반드시 필요하지 않습니다.
제 개인적인 경험으로는 모든 것을 하나로 묶는 프레임워크를 구축하면 쉽게 ORM이나 플러그인 등을 사용할 수 있게 됩니다.또한 곧 의존성을 해소할 수 없게 됩니다.
웹 프레임워크를 선택하는 것은 어려운 결정이며, REST API를 공개하기 위해 풀 스택 솔루션을 선택하는 것은 피하고 싶습니다.
만약 당신이 정말로 Django를 사용하고 싶다면, Piston은 django 앱을 위한 훌륭한 REST 프레임워크입니다.
Cherry Py도 좋아 보이지만 REST보다 RPC가 더 많은 것 같습니다.
샘플(사용한 적이 없습니다)을 보면 REST만 필요하다면 web.py이 가장 좋고 깨끗할 것입니다.
REST에 관한 Cherry Py documents에서 논의합니다.http://docs.cherrypy.org/dev/progguide/REST.html
특히 MethodDispatcher라고 불리는 내장 CherryPy 디스패처를 언급하고 있습니다.MethodDispatcher는 HTTP-verb 식별자(GET, POST 등)에 근거해 메서드를 호출합니다.
2010년, 파이프와 재녹음.bfg 커뮤니티는 repoze.bfg를 가장 많이 기반으로 하는 웹 프레임워크인 피라미드를 만들기 위해 힘을 합쳤습니다.상위 프레임워크의 철학을 유지하며 RESTful 서비스에 사용할 수 있습니다.볼만해.
Piston은 Django 어플리케이션용 RESTful API를 작성하기 위한 매우 유연한 프레임워크입니다.
이제 모든 종류의 파이썬 웹 프레임워크가 RESTful 인터페이스를 구현할 수 있을 것 같습니다.
장고에게는 맛있는 파이와 피스톤 외에도 장고 휴식 프레임워크는 언급할 가치가 있는 유망주다.이미 프로젝트 하나를 원활하게 이행했습니다.
Django REST 프레임워크는 Django를 위한 경량 REST 프레임워크로, 잘 연결된 자기 설명형 웹 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, 자체 설명 문서(비누 기반 웹 서비스 등) 및 약간의 테스트를 위한 샌드박스를 제공합니다.매우 편리합니다.
링크: http://django-rest-framework.org/
저는 비단뱀의 세계에 대한 전문가는 아니지만 django를 사용해 왔습니다.이것은 훌륭한 웹 프레임워크이며, 편안한 프레임워크를 만드는 데 사용할 수 있습니다.
web2py는 여기와 여기(동영상)에서 설명한 바와 같이 RESTful API를 쉽게 구축할 수 있도록 지원합니다.특히 를 참조해 주세요.이것에 의해, 요구 arg를 데이타베이스 쿼리에 매핑 하는 URL 패턴을 정의할 수 있습니다.또, URL내의 임의의 자연 언어 쿼리를 전달할 수 있습니다.
장고를 사용하고 있다면 장고피스톤의 대체품으로 장고타스티피를 고려해보세요.피스톤보다 비 ORM 데이터 소스에 맞게 조정하기가 쉽고 문서도 우수합니다.
TurboGears 또는 Bottle을 강력히 권장합니다.
터보 기어:
- 장고보다 덜 장황하다
- HTML을 중시하지 않고 유연성이 향상
- 하지만: 덜 유명함
병:
- 매우 빠르다
- 매우 배우기 쉽다
- 하지만: 미니멀리즘적이고 성숙하지 않다
엄격한 REST 서비스를 위한 프레임워크를 준비하고 있습니다.http://prestans.googlecode.com를 참조하십시오.
현재 초기 Alpha에서 mod_wsgi와 Google의 AppEngine에 대해 테스트 중입니다.
테스터와 피드백을 찾고 있습니다.감사해요.
언급URL : https://stackoverflow.com/questions/713847/recommendations-of-python-rest-web-services-framework
'sourcecode' 카테고리의 다른 글
ehcache에서 존속 가능 시간과 아이돌 시간을 구별하는 방법 (0) | 2022.12.06 |
---|---|
'==' 또는 '==='을 사용하여 문자열과 'strcmp()'을 비교합니다. (0) | 2022.12.06 |
Java 패키지에서 속성 파일 로드 (0) | 2022.12.06 |
변환을 방지하기 위해 vuex 상태에서 컬렉션을 복사하는 것이 표준입니까? (0) | 2022.12.06 |
__all_은 Python에서 무엇을 의미합니까? (0) | 2022.12.06 |