web-services на - Рекомендации Python REST(веб-сервисы)?




примеры flask (14)

Есть ли список где-нибудь из рекомендаций разных REST-инфраструктур на основе Python для использования на сервере, чтобы написать свои собственные API RESTful? Предпочтительно с плюсами и минусами.

Пожалуйста, не стесняйтесь добавлять рекомендации здесь. :)


Answers

Я настоятельно рекомендую TurboGears или Bottle:

TurboGears:

  • менее подробный, чем django
  • более гибкий, менее ориентированный на HTML
  • но: менее известный

Бутылка:

  • очень быстро
  • очень легко учиться
  • но: минималистичный и не зрелый

Удивленный никто не упоминал flask .

from flask import Flask
app = Flask(__name__)

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

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

Мы используем Django для веб-сервисов RESTful.

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

У нас есть два типа URL: «html» URL, которые реализуют ориентированные на человека HTML-страницы, и URL-адрес «json», которые реализуют обработку, ориентированную на веб-службы. Наши функции просмотра часто выглядят так.

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, поэтому сделайте их частью вызываемого класса или напишите декораторы, если это поможет.


В 2010 году сообщества Pylons и repoze.bfg «объединили свои силы» для создания Pyramid , веб-платформы, основанной в основном на repoze.bfg. Он сохраняет философию своих родительских структур и может использоваться для служб RESTful . Это стоит посмотреть.


Я не вижу причин использовать Django, чтобы разоблачить REST api, есть более легкие и гибкие решения. Django несет в себе много других вещей, которые не всегда нужны. Конечно, не нужно, если вы хотите показать какой-либо код в качестве службы REST.

Мой личный опыт, fwiw, заключается в том, что, когда у вас есть единая платформа для всех, вы начнете использовать ее ORM, его плагины и т. Д. Только потому, что это легко, и в мгновение ока у вас есть зависимость от которого очень трудно избавиться.

Выбор веб-фреймворка - это сложное решение, и я бы избегал выбора полного решения стека, чтобы разоблачить REST api.

Теперь, если вам действительно нужно / нужно использовать Django, то Piston - хорошая структура REST для приложений django.

Тем не менее, CherryPy выглядит очень хорошо, но кажется более RPC, чем REST.

Глядя на образцы (я никогда не использовал его), возможно, web.py является лучшим и чистым, если вам нужен только REST.


Мне очень нравится 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 в вашем веб-браузере.


Что-то, чтобы быть осторожным при разработке RESTful API, - это объединение GET и POST, как будто это одно и то же. Легко сделать эту ошибку с помощью функций, основанных на функциях Django и диспетчера по умолчанию CherryPy , хотя обе структуры теперь обеспечивают способ решения этой проблемы ( представления на основе MethodDispatcher и MethodDispatcher , соответственно).

HTTP-глаголы очень важны в REST, и если вы не будете очень осторожны в этом, вы попадете в анти-шаблон REST .

Некоторые фреймворки, которые это правильно, - 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()

Логика службы реализована только один раз, и правильный выбор представления (заголовок Accept) + отправка в надлежащую функцию рендеринга (или шаблон) выполняется аккуратным, прозрачным способом.

$ 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, интерфейсах меток MethodDispatcher и Flask и Bottle от CherryPy. Когда вопрос был задан, он не существовал.


Вот обсуждение в документах CherryPy по REST: docs.cherrypy.org/dev/progguide/REST.html

В частности, упоминается встроенный диспетчер CherryPy под названием MethodDispatcher, который вызывает методы на основе их идентификаторов HTTP-глаголов (GET, POST и т. Д.).


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


Я использую Django, тогда вы можете рассмотреть django-tastypie как альтернативу django-piston . Легче настраивать источники данных, отличных от ORM, чем поршень, и имеет отличную documentation .


Я не эксперт в мире python, но я использую Django который является отличной веб-картой и может использоваться для создания спокойной структуры.


См. Вики-страницу Python Web Framework .

Вероятно, вам не нужны полные фреймворки стека , но оставшийся список все еще довольно длинный.



Бесстыдный плагин, я написал для этого библиотеку: P https://github.com/houqp/shell.py

В настоящее время это оболочка для popen и shlex. Он также поддерживает команды конвейеров, чтобы упростить цепочку команд в Python. Таким образом, вы можете делать такие вещи, как:

ex('echo hello shell.py') | "awk '{print $2}'"






python web-services rest frameworks