Рекомендації Python REST (веб-сервісів)? [зачинено]


321

Чи є десь список рекомендацій різних каркасів REST на основі Python для використання на сервері для написання власних API RESTful? Переважно з плюсами і мінусами.

Будь ласка, не соромтесь додавати сюди рекомендації. :)


Ось хороший підручник з використання web.py dreamsyssoft.com/blog/blog.php?/archives/…
Triton Man

Відповіді:


192

Що потрібно бути обережним при розробці API RESTful - це співвідношення GET і POST, як ніби вони однакові. Це легко зробити цю помилку з Django «s функції на основі поглядів і CherryPy » по замовчуванням диспетчера s, хоча обидві структури в даний час забезпечує спосіб обійти цю проблему ( погляди на основі класів і MethodDispatcher , відповідно).

HTTP-дієслова дуже важливі в REST, і якщо ви не будете дуже обережні, ви потрапите в анти-шаблон REST .

Деякі рамки, які підходять правильно, це web.py , колба та пляшка . У поєднанні з бібліотекою мімеренда (повне розкриття: я це написав) вони дозволяють писати приємні 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 р.) : Додана інформація про класичні погляди Django, CherryPy's MethodDispatcher та фрейми та пляшки. Жодного разу не існувало, коли було задано питання.


12
Це неправильно, Django має повну підтримку розпізнавання POST vs GET та обмеження переглядів лише певними методами.
aehlke

20
Я мав на увазі, що за замовчуванням Django ставиться до POST і GET так, ніби вони є одне і те ж, що дуже незручно, коли ви робите послуги RESTful, оскільки це змушує вас робити: if request.method == 'GET': do_something () elif request.method == 'POST': do_something_else () web.py не має такої проблеми
Martin Blech

19
@Wahnfrieden: Якщо в Django є нативна підтримка для обробки різних дієслів HTTP окремо (під "рідним" я маю на увазі не потрібний "if request.method == X"), чи можете ви мені вказати якусь документацію?
Мартін Блех

3
Зв'язок POST та GET не поширюється на класичні перегляди Django (додані в 1.3), але я вважаю, що це справедливо для попередніх версій.
ncoghlan

1
Відповідь щодо CherryPy невірна. З Документів: "REST (Представницький державний трансфер) - це архітектурний стиль, який добре підходить для реалізації в 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
Фляшку не було там, коли було задано питання ...
Мартін Блех

2
Flask не працює з Python 3.x
bitek

3
Flask.dev тепер підтримує Python 3
Sean Vieira

2
Колба підтримує Python 3.3 або новішої версії.
mb21

3
noob тут, як це RESTful?
avi

23

Ми використовуємо Django для RESTful веб-сервісів.

Зауважте, що - поза межами Джанго не було достатньо тонкої аутентифікації для наших потреб. Ми використовували інтерфейс Django-REST , який дуже допоміг. [Ми з тих пір розгорнули свою власну, тому що ми зробили так багато розширень, що це стало кошмаром технічного обслуговування.]

У нас є два види URL-адрес: "html" URL-адреси, які реалізують орієнтовані на людину HTML-сторінки, та "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, тому зробіть їх частиною класу, за яким можна телефонувати, або напишіть декораторів, якщо це допоможе.


2
Жахливе повторення d = someUsefulThing ... Навіть хлопці Django пропонують DRY.
temoto

5
@temoto: Якщо y = someUsefulThing(...)це "жахливе повторення", то всі посилання на всі функції та методи "жахливі". Я не розумію, як уникнути посилання на функцію не один раз.
S.Lott

5
@temoto: "Коли вам потрібно змінити аргументи, передані на деякіUsefulThing, є ймовірність, що хтось забуде це зробити у всіх дзвінках"? Що? Як це "жахливо"? Це банальний наслідок посилання на функцію не один раз. Я не розумію, про що ви говорите, і як посилання на функцію є "жахливим", оскільки це неможливо.
S.Lott

4
Дивіться прийняту відповідь. Вираз результату {'message': 'Привіт,' + ім'я + '!'} Пишеться один раз для всіх презентацій.
temoto

3
Ваші функції htmlView та jsonView обслуговують різні представлення для одних і тих же даних, правда? Так someUsefulThing(request, object_id)само вираження пошуку даних. Тепер у вас є дві копії одного виразу в різних точках вашої програми. У прийнятій відповіді вираз даних записується один раз. Замініть свій someUsefulThingдзвінок на довгий рядок, наприклад, paginate(request, Post.objects.filter(deleted=False, owner=request.user).order_by('comment_count'))і подивіться на код. Сподіваюся, це проілюструє мою точку зору.
темпото


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? градусів = 50 відобразиться 122.0у вашому веб-браузері.


35
Це приємний приклад, але в цьому немає нічого РЕСТАВНОГО.
aehlke

3
@Wahnfrieden: Не могли б ви допомогти решті нас, пояснивши, чому ви не вважаєте, що вищезазначене РЕСТАВНО? З моєї точки зору, це виглядає як класичний приклад REST і, здається, не порушує жодне з правил або обмежень системи RESTful.
lilbyrdie

42
Простіше кажучи, те, що зроблено вище в прикладі CherryPy, полягає у викритті методів як віддалених процедур, що викликаються HTTP. Це RPC. Це повністю орієнтоване на дієслово. RESTful архітектури фокусуються на ресурсах, якими керує сервер, а потім пропонують дуже обмежений набір операцій над цими ресурсами: конкретно, POST (створення), GET (читання), PUT (оновлення) та DELETE (видалення). Маніпулювання цими ресурсами, зокрема зміна їх стану через PUT, є ключовим шляхом, за яким "речі відбуваються".
verveguy

2
Ви можете написати більше RESTfull API, використовуючи CherryPy docs.cherrypy.org/stable/progguide/REST.html
Radian,


8

Я не бачу жодних причин використовувати Django просто для викриття api REST, є більш легкі та гнучкі рішення. Джанго несе на стіл багато інших речей, які не завжди потрібні. Напевно, це не потрібно, якщо ви хочете виставити якийсь код як послугу REST.

Мій особистий досвід, fwiw, полягає в тому, що як тільки ви матимете фреймворк одного розміру, ви почнете використовувати його ORM, його плагіни і т. Д. Просто тому, що це легко, і за короткий час у вас не виникне залежність. цього дуже важко позбутися.

Вибір веб-рамки - це важке рішення, і я б уникнув вибору рішення для повного стека лише для того, щоб виставити RI-версію api.

Тепер, якщо вам дійсно потрібно / хочете використовувати Django, то Piston - це приємна рамка REST для додатків django.

Як сказано, CherryPy також виглядає дуже приємно, але здається більше RPC, ніж REST.

Дивлячись на зразки (я ніколи цього не використовував), напевно, web.py - найкращий і найчистіший, якщо вам потрібен лише REST.


6

Ось дискусія в документах CherryPy на REST: http://docs.cherrypy.org/dev/progguide/REST.html

Зокрема, він згадує про вбудований диспетчер CherryPy під назвою MethodDispatcher, який викликає методи, засновані на їхніх ідентифікаторах HTTP-дієслів (GET, POST тощо).


6

У 2010 році спільноти Pylons та repoze.bfg "об'єднали сили", щоб створити Pyramid , веб-структуру, яка найбільше базується на repoze.bfg. Він зберігає філософії своїх батьківських рамок і може використовуватися для RESTful послуг . Це варто подивитися.


За допомогою Pyramid ви можете скористатися Cornice , який надає корисних помічників для створення та документування веб-служб REST.
Кальвін


5

Здається, всі види веб-рамок python зараз можуть реалізовувати інтерфейси RESTful.

Для Django, окрім tastypie та поршня, багатообіцяючим є згадка про django-rest-frame. Я вже безперечно мігрував один із своїх проектів.

Рамка Django REST - це легка рамка REST для Django, яка має на меті полегшити побудову добре пов'язаних, самоописуючих 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, але повністю перейшов на django-rest-
frame

3

Я не є експертом у світі пітонів, але використовую django, який є чудовою веб-базою та може бути використаний для створення спокійної структури.


3

web2py включає підтримку легко створювати API RESTful, описаний тут і тут (відео). Зокрема, подивіться parse_as_rest, що дозволяє визначати шаблони URL-адрес, які відображають аргументи запиту до запитів бази даних; і smart_query, що дозволяє передавати довільні запити на природній мові в URL.


Згадані посилання більше не доступні
milovanderlinden

Посилання оновлено - спробуйте ще раз.
Ентоні


0

Я настійно рекомендую TurboGears або пляшку:

TurboGears:

  • менш багатослівний, ніж джанго
  • більш гнучка, менш орієнтована на HTML
  • але: менш відомий

Пляшка:

  • дуже швидко
  • дуже легко вчитися
  • але: мінімалістичний і не зрілий

0

Ми працюємо над основою для суворих REST-послуг, перегляньте http://prestans.googlecode.com

Наразі це є на початку Alpha, ми протестуємо на модулі mod_wsgi та Google AppEngine.

Шукаєте тестерів та відгуки. Дякую.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.