[python] Python REST (웹 서비스) 프레임 워크의 권장 사항 [닫은]

서버 측에서 고유 한 RESTful API를 작성하기 위해 사용할 수있는 다른 Python 기반 REST 프레임 워크의 권장 사항 목록이 있습니까? 바람직하게는 장단점이 있습니다.

여기에 추천을 추가하십시오. 🙂



답변

RESTful API를 설계 할 때주의해야 할 사항은 마치 GET과 POST가 동일한 것처럼 보입니다. Django함수 기반 뷰CherryPy 의 기본 디스패처 를 사용하여 실수를 저지르는 것은 쉽지만 두 프레임 워크 모두 이제이 문제를 해결할 수있는 방법을 제공합니다 (각각 클래스 기반 뷰MethodDispatcher ).

HTTP 동사는 REST에서 매우 중요 하며, 이에 대해주의하지 않으면 REST anti-pattern에 빠지게됩니다 .

올바른 프레임 워크는 web.py , FlaskBottle 입니다. 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가 가장 좋고 깨끗합니다.