Элегантный способ делать RPC-вызовы функций Python в проекте Django - PullRequest
2 голосов
/ 17 августа 2011

Я пытаюсь создать сайт django для доступа к данным в базе данных MySQL. Намерение также состоит в том, чтобы создать пользовательский интерфейс в Dojo (javascript). Также я хотел бы, чтобы серверная часть django также предоставляла веб-сервисы (RPC для функций python), чтобы разрешить удаленный доступ к базе данных MySQL. Так, например, если кто-то хочет использовать сценарии Perl для доступа к базе данных (и, возможно, другие дополнительные функции, такие как вычисления на основе данных в базе данных), он может сделать это на своем родном языке (Perl).

В идеале API веб-сервисов одинаков для javascript и других удаленных сервисов, которым требуется доступ к этим сервисам. Я обнаружил, что JSON-RPC - хороший способ для этого, поскольку в javascript обычно есть встроенная поддержка для этого в дополнение к многочисленным дополнительным преимуществам. Также многие люди предпочитают SOAP JSON.

Я видел несколько способов сделать это:

1) Создайте уникальный URI для каждой функции, к которой вы хотите получить доступ: https://code.djangoproject.com/wiki/JSONRPCServerMiddleware

2) Создайте одну точку доступа и передайте имя метода в пакете JSON. В этом конкретном примере SMD генерируется автоматически. https://code.djangoproject.com/wiki/Jsonrpc

Проблема с (1) состоит в том, что если есть много функций, к которым необходимо получить доступ, то будет много URI, которые будут использоваться. Это не похоже на элегантное решение. Проблема с (2) заключается в том, что мне нужно сравнить функции со списком всех функций. Опять же, это тоже не элегантное решение.

Нет ли способа использовать преимущества (1) и (2) для создания интерфейса, который бы: - Только один URI используется в качестве точки доступа - Функции вызываются напрямую (без сравнения со списком функций)

Любая помощь с этим будет по достоинству оценена. Спасибо!

Ответы [ 3 ]

1 голос
/ 19 августа 2011

Одной из возможностей для сравнения было бы использование dict следующим образом:

def func1(someparams):
    #do something
    return True

def func2(sameparams):
    #do something else
    return True


{'func1': func1,
 'func2': func2}

Затем, когда вы получаете вызов API, вы просматриваете его в dict и вызываете оттуда, любая функция нев диктанте получился бы обработчик 404.

1 голос
/ 17 августа 2011

как насчет использования REST API ?

0 голосов
/ 06 сентября 2011

Похоже, что вам действительно нужен RPC-сервер какого-то типа (скажем, SOAP, использующий soaplib), написанный на python и использующий модель данных вашего приложения и любые другие API, которые вы создали для обработки бизнес-логики.,

Так что я мог бы реализовать веб-сервис с soaplib и заставить его вызываться в datamodel и другие модули python по мере необходимости.Люди, желающие получить доступ к данным вашего веб-приложения, будут использовать службу SOAP, но веб-приложение будет использовать базовую модель данных + apis (для скорости ваше веб-приложение может также использовать службу SOAP, но это будет медленнее).

...