优雅地在Django项目中调用Python函数的RPC方法
我正在尝试创建一个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 个回答
听起来你真正想要的是一种远程过程调用(RPC)服务器,比如说用soaplib来实现的SOAP服务,这个服务器是用Python写的,并且使用你应用程序的数据模型,还有你为处理业务逻辑构建的其他API。
所以我可能会用soaplib来实现这个网络服务,让它根据需要调用数据模型和其他Python模块。想要访问你网络应用数据的人会使用这个SOAP服务,而你的网络应用则会使用底层的数据模型和API(为了速度,你的网络应用也可以使用SOAP服务,但那样会慢一些)。
一种比较的方式是使用字典,像这样:
def func1(someparams):
#do something
return True
def func2(sameparams):
#do something else
return True
{'func1': func1,
'func2': func2}
然后,当你收到API请求时,你可以在字典里查找对应的内容,然后调用相应的函数。如果字典里没有这个函数,就会触发404错误处理。
那使用 REST API 呢?