Рекомендации REST Python (веб-сервисы) платформа? [закрытый]

из or_log_all_proc, or_proc, or_log, Patient

Ваш SELECT не содержит критериев объединения , поэтому он будет генерировать продукт из все записи из трех из этих таблиц и набор результатов любой таблицы фильтруются предложениями LIKE. Это корень вашей проблемы с производительностью.

Решение довольно простое. Правильно объединяйте таблицы, используя соответствующие ключевые столбцы.

Кстати, это преимущество использования синтаксиса соединения ANSI 92. Делая тип объединения явным, мы должны написать CROSS JOIN, если мы действительно хотим сгенерировать продукт, и не позволяет нам сделать это случайно.

Ожидать, что LIKE '% any%' будет быстрым, также бесполезно

До определенного момента. Скорее всего, это полное сканирование таблицы, но это индексированный столбец, тогда мы можем получить полное быстрое сканирование. Даже если это просто FTS, это не обязательно катастрофично, особенно если стол маленький или нарро. Как с большинством задач настройки, это действительно зависит от деталей.

321
задан Jonik 10 June 2009 в 07:00
поделиться

7 ответов

При разработке RESTful API следует проявлять осторожность при объединении GET и POST, как если бы они были одним и тем же. Эту ошибку легко допустить с помощью Django представлений на основе функций и диспетчера по умолчанию CherryPy , хотя обе структуры теперь позволяют решить эту проблему ( представления на основе классов и 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, структурах CherryPy MethodDispatcher и Flask и Bottle. Ни того, ни другого не существовало, когда был задан вопрос.

s Фреймворки MethodDispatcher и Flask и Bottle. Ни того, ни другого не существовало, когда был задан вопрос.

s Фреймворки MethodDispatcher и Flask и Bottle. Ни того, ни другого не существовало, когда был задан вопрос.

192
ответ дан 23 November 2019 в 00:58
поделиться

Я не эксперт по миру Python, но я использовал django, который является превосходной веб-платформой и может использоваться для создания успокоительной платформы.

3
ответ дан Jeremy B. 23 November 2019 в 00:58
поделиться

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

8
ответ дан Eli Courtwright 23 November 2019 в 00:58
поделиться

Посмотрите веб-Платформы Python Wiki.

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

11
ответ дан gimel 23 November 2019 в 00:58
поделиться

Мы используем Django для УСПОКОИТЕЛЬНЫХ веб-сервисов.

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

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

23
ответ дан S.Lott 23 November 2019 в 00:58
поделиться
8
ответ дан 23 November 2019 в 00:58
поделиться

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

TurboGears:

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

Bottle :

  • очень быстро
  • очень легко выучить
  • но: минималистично и незрело
0
ответ дан 23 November 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: