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

2 投票
3 回答
2419 浏览
提问于 2025-04-16 23:48

我正在尝试创建一个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 个回答

0

听起来你真正想要的是一种远程过程调用(RPC)服务器,比如说用soaplib来实现的SOAP服务,这个服务器是用Python写的,并且使用你应用程序的数据模型,还有你为处理业务逻辑构建的其他API。

所以我可能会用soaplib来实现这个网络服务,让它根据需要调用数据模型和其他Python模块。想要访问你网络应用数据的人会使用这个SOAP服务,而你的网络应用则会使用底层的数据模型和API(为了速度,你的网络应用也可以使用SOAP服务,但那样会慢一些)。

1

一种比较的方式是使用字典,像这样:

def func1(someparams):
    #do something
    return True

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


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

然后,当你收到API请求时,你可以在字典里查找对应的内容,然后调用相应的函数。如果字典里没有这个函数,就会触发404错误处理。

1

那使用 REST API 呢?

撰写回答