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


321

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

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


답변:


192

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 프레임 워크에 대한 정보가 추가되었습니다. 질문을 받았을 때도 존재하지 않았습니다.


12
Django는 POST vs GET을 인식하고 특정 방법으로 만 뷰를 제한하는 기능을 완벽하게 지원합니다.
aehlke

20
기본적으로 Django는 POST와 GET을 동일한 것으로 취급하므로 RESTful 서비스를 수행 할 때 강제로 수행 할 때 매우 불편합니다. elif request.method == 'POST': do_something_else () web.py는 그런 문제가 없습니다
Martin Blech

19
@Wahnfrieden : Django에서 다른 HTTP 동사를 개별적으로 처리하기위한 기본 지원이있는 경우 ( "native"로 "if request.method == X"가 필요하지 않음을 의미), 일부 문서를 알려주시겠습니까?
Martin Blech

3
POST와 GET의 충돌은 Django의 클래스 기반 뷰 (1.3에 추가됨)에는 적용되지 않지만 이전 릴리스에는 유효하다고 생각합니다.
ncoghlan 8

1
CherryPy에 대한 답변이 잘못되었습니다. Docs : "REST (Representational State Transfer)는 CherryPy 구현에 적합한 아키텍처 스타일입니다." - docs.cherrypy.org/dev/progguide/REST.html
데릭 리츠

70

아무도 플라스크를 언급하지 않았다 .

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

7
질문이 나왔을 때 플라스크는 거기에 없었습니다.
Martin Blech

2
Flask는 Python 3.x에서 작동하지 않습니다
bitek

3
Flask.dev는 이제 Python 3을 지원합니다
Sean Vieira

2
플라스크 는 Python 3.3 이상을 지원합니다 .
mb21

3
멍청한 놈, 이것이 어떻게 RESTful입니까?
avi

23

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기능은 약간 성가신 될 수있는 모든 매우 유사합니다. 그러나 그것은 파이썬이므로 호출 가능한 클래스의 일부로 만들거나 도움이된다면 데코레이터를 작성하십시오.


2
D의 끔찍한 반복 = someUsefulThing ... 장고들조차도 DRY를 제안합니다.
temoto

5
@temoto : y = someUsefulThing(...)"끔찍한 반복"인 경우 모든 함수와 메소드에 대한 모든 참조는 "awful"입니다. 함수를 두 번 이상 참조 하지 않는 방법을 이해하지 못했습니다 .
S.Lott

5
@temoto : "someUsefulThing에 전달 된 인수를 변경해야 할 때 모든 호출에서이를 잊어 버릴 가능성이 있습니까?" 뭐? 그것은 어떻게 "끔찍한"입니까? 그것은 함수를 두 번 이상 참조하는 사소한 결과입니다. 나는 당신이 무엇을 말하고 있는지와 함수 참조가 어떻게 피할 수 없는지 "어색한"지 이해하지 못했습니다.
S.Lott

4
허용 된 답변을 참조하십시오. 결과 표현 { 'message': 'Hello,'+ name + '!'}는 모든 프리젠 테이션에 대해 한 번 작성됩니다.
temoto

3
htmlView 및 jsonView 함수는 동일한 데이터에 대해 다른 표현을 제공합니다. someUsefulThing(request, object_id)데이터 검색 표현식도 마찬가지 입니다. 이제 프로그램의 다른 지점에 동일한 표현의 사본이 두 개 있습니다. 허용되는 답변에서 데이터 표현은 한 번 작성됩니다. 당신의 교체 someUsefulThing긴 문자열로 전화를, 같은 paginate(request, Post.objects.filter(deleted=False, owner=request.user).order_by('comment_count'))과 코드를 보면. 나는 그것이 내 요점을 설명하기를 바랍니다.
temoto

11

Python Web Frameworks 위키를 참조하십시오 .

전체 스택 프레임 워크 가 필요하지는 않지만 나머지 목록은 여전히 ​​길다.


8

나는 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웹 브라우저에 표시 됩니다.


35
좋은 예이지만, 이것에 대해 충분한 것은 없습니다.
aehlke

3
@Wahnfrieden : 위의 내용이 RESTful이라고 생각하지 않는 이유를 명확히하여 나머지 사람들을 도울 수 있습니까? 필자의 관점에서 보면 REST의 고전적인 예처럼 보이고 RESTful 시스템의 규칙이나 제약 조건을 위반하지 않는 것 같습니다.
lilbyrdie

42
간단히 말해서, 위의 CherryPy 예제는 "HTTP 호출 가능"원격 프로 시저로 메소드를 노출하는 것입니다. RPC입니다. 전적으로 "동사"지향적입니다. RESTful 아키텍처 는 서버에서 관리 하는 리소스 에 중점을 둔 후 POST (만들기), GET (읽기), PUT (업데이트) 및 DELETE (삭제)와 같은 리소스에 대해 매우 제한된 작업 집합 을 제공합니다 . 이러한 자원의 조작, 특히 PUT을 통해 상태 를 변경하는 것은 "물건이 발생하는"주요 경로입니다.
verveguy



8

Django를 사용하여 REST API를 노출시킬 이유가 없습니다. 가볍고 유연한 솔루션이 있습니다. Django는 테이블에 많은 다른 것들을 가지고 다니며 항상 필요한 것은 아닙니다. 일부 코드 만 REST 서비스로 노출하려는 경우에는 필요하지 않습니다.

내 개인적인 경험은, 당신이 하나의 크기에 맞는 모든 프레임 워크를 갖게되면 ORM, 플러그인 등을 사용하기 시작하기 쉽다는 것입니다. 그것은 제거하기가 매우 어렵습니다.

웹 프레임 워크를 선택하는 것은 어려운 결정이며 REST API를 노출하기 위해 풀 스택 솔루션을 선택하지 않는 것이 좋습니다.

Django를 사용해야 할 필요가 있다면 Piston은 django 앱을위한 훌륭한 REST 프레임 워크입니다.

CherryPy는 정말 멋지지만 REST보다 RPC가 더 많은 것 같습니다.

샘플을 보았을 때 (필자는 사용하지 않았 음) REST 만 필요한 경우 web.py가 가장 좋고 깨끗합니다.


6

다음은 REST의 CherryPy 문서에 대한 토론입니다. http://docs.cherrypy.org/dev/progguide/REST.html

특히 MethodDispatcher라는 CherryPy 디스패처가 내장되어 있는데, 이는 HTTP 동사 식별자 (GET, POST 등)를 기반으로 메소드를 호출합니다.


6

2010 년에 Pylons와 repoze.bfg 커뮤니티 는 repoze.bfg에 가장 많은 기반을 둔 웹 프레임 워크 인 Pyramid 를 만들기 위해 "동맹"에 합류했습니다 . 상위 프레임 워크의 철학을 유지하고 RESTful 서비스에 사용할 수 있습니다 . 볼만한 가치가 있습니다.


Pyramid를 사용하면 REST 웹 서비스를 작성하고 문서화하는 데 유용한 헬퍼를 제공하는 Cornice를 사용할 수 있습니다.
Calvin


5

모든 종류의 파이썬 웹 프레임 워크가 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, 자체 설명 문서 (비누 기반 웹 서비스와 같은) 및 심지어 샌드 박스를 제공하여 비트를 테스트합니다. 매우 편리합니다.

링크 : http://django-rest-framework.org/


2
특히 탐색 가능한 인터페이스는 개발하는 동안 많은 시간을 절약합니다! 다른 많은 장점들 때문에 나머지 구현을 시작하는 모든 사람들은 살펴 봐야합니다. 나는 tastypie 시작하지만, 장고 - 나머지 프레임 워크로 완전히 전환
michel.iamit을

3

나는 파이썬 세계의 전문가는 아니지만 훌륭한 웹 프레임 워크이며 편안한 프레임 워크를 만드는 데 사용할 수있는 django 를 사용하고 있습니다.


3

web2py 에는 여기여기에 설명 된 RESTful API를 쉽게 빌드 할 수있는 지원이 포함되어 있습니다 (비디오). 특히을 보면 parse_as_rest요청 인수를 데이터베이스 쿼리에 매핑하는 URL 패턴을 정의 할 수 있습니다. 및 smart_queryURL을 통해 임의의 자연어 쿼리를 전달할 수 있습니다.


언급 된 링크는 더 이상 사용할 수 없습니다
milovanderlinden

링크가 업데이트되었습니다-다시 시도하십시오.
Anthony


0

TurboGears 또는 Bottle을 강력히 권장합니다.

터보 기어 :

  • 장고보다 덜 장황하다
  • 보다 유연하고 덜 HTML 지향적 인
  • 그러나 : 덜 유명한

병:

  • 매우 빠른
  • 배우기 매우 쉬운
  • 그러나 : 최소한의 성숙하지 않은

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.