在Django项目中对Python函数进行RPC调用的优雅方法

时间:2011-08-17 18:22:29

标签: python django json rpc smd

我正在尝试创建一个django网站来访问MySQL数据库中的数据。目的是在Dojo(javascript)中创建UI。此外,我希望django后端还提供web服务(RPC for python函数),以允许远程访问MySQL数据库。因此,例如,如果有人想要使用Perl脚本来访问数据库(以及可能的其他附加功能,例如基于数据库中的数据的计算),他们可以用他们的母语(Perl)来实现。

现在理想情况下,javascript以及另一个想要访问这些服务的远程服务的Web服务API是相同的。我发现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 个答案:

答案 0 :(得分:1)

使用REST API怎么办?

答案 1 :(得分:1)

进行比较的一种可能性是使用像这样的字典:

def func1(someparams):
    #do something
    return True

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


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

然后当你得到API调用时,你在dict中查找并从那里调用,任何不在dict中的函数都会获得404处理程序。

答案 2 :(得分:0)

听起来你真正想要的是某种RPC服务器(SOAP,比方说,使用soaplib)是用python编写的,并使用你的应用程序的数据模型,以及你为构建业务逻辑而构建的其他API 。

因此,我可以使用soaplib实现Web服务,并根据需要调用datamodel和其他python模块。想要访问您的Web应用程序数据的人将使用SOAP服务,但Web应用程序将使用底层数据模型+ apis(为了提高速度,您的Web应用程序也可以使用SOAP服务,但速度会慢一些。)