外部直接路由器的python实现

extdirect的Python项目详细描述


====
简介
===

ext direct提供了一个服务器端ext.direct路由器的python实现,它可以接受和解析ext.direct
请求数据,将其路由到正确的方法,并创建、编码和返回包装结果的正确数据结构。ext direct还提供了一个
类,该类可以从路由器类生成定义ext.direct
提供程序的客户端javascript。

有关ext.direct功能的完整描述,请参见:

http://www.extjs.com/products/extjs/direct.php

让我们看看服务器端是如何工作的。首先,我们将定义一个路由器:

>;>from extdirect.router import directrouter
>;>class testutils(directrouter):

…定义大写(self,word):
…返回word.upper()

…今天的定义(自我):
…return"今天是星期三。"


假设我们在url'/utils'上有这个类,并且我们希望包含这些方法的客户端命名空间被称为"remote"。

>;>;来自extdirect.router import directproviderdefinition
>;>;打印directproviderdefinition(testutils,"/utils","remote").render()
…#doctest:+规范化空白
<;script type="text/javascript">;
ext.direct.addprovider({"url":"/utils",
"namespace":"remote",
"type":"remoting",
"id":"testutils",
"actions":{"testutils":[{"name":"capital","len":1},
"name":"today,","len":1}]});
<;/script>;


现在,假设我们以某种方式向客户端提供了此代码,并且我们的类在该url上可用,我们现在可以从浏览器访问这些方法:


remote.testutils.capital({word:'foo',console.log)

到testutils
类的"capital"方法,并将结果馈送给回调函数,在本例中,回调函数仅将
结果打印到js控制台。

让我们从服务器的角度看一下这是如何工作的。调用
将使用json编码的主体发出post请求,因此让我们手动创建
:从extdirect.router导入json
>;data={"action":"testutils","method":"capital","data":[{"word":"foo"}],"type":"rpc","tid":1}
>;body=json.dumps(data)

s作为"action"传入,方法名为"method",并且
作为包含
参数散列的单个成员数组发送的任何数据。就我们的目的而言,"type"将始终是"rpc"。ext.direct request s
还提供了一个事务id("tid"),您可以使用它来处理过时数据的可能性。

ct显示ext.direct在
客户机上预期的结构:

>;'{"tid":1,"action":"testutils","type":"rpc","method":"capital","result":"foo"}

请注意"result",这是我们所期望的。客户会解码这个
对象并将"result"值传递给回调。为了好玩,让我们检查一下我们定义的其他方法:data={"action":"testutils","method":"today","data":[],"type":"rpc","tid":1}
>;>body=json.dumps(data)
>;>resultob=json.loads(utils(body))
>;>print resultob['result']
今天是星期三。



==
zope路由器
==




在zope中使用extdirect非常简单,因为有一个自定义的zcml
指令为服务器端api注册了一个browsview和一个
viewlet来提供提供者定义to客户。

1.定义类

,例如在myapi.py中:


myapi类(directrouter):

def a_method(self):
return‘a value’



2。将类注册为直接路由器

<;configure xmlns="http://namespaces.zope.org/browser">;

<;include package="extdirect.zope"file="meta.zcml"/>;

<;direct router
name="myapi"
namespace="myapp.remote"
class=".myapi.myapi"
/>;

<;/配置>;



>3。在模板中提供extdirect viewletmanager。
(注意:ext是一个先决条件。)

<;tal:block tal:content="structure provider:extdirect"/>;



4。随意调用方法!

<;script>;


函数a_method_callback(result){
…使用result…
}


<;/script>;


=====
=====


,因此,您有一个django应用程序,您希望添加ext.direct。方法如下:

1.将"extdirect.django"添加到settings.py

2中已安装的应用程序。在一个名为direct.py的新文件中,定义您的路由器类并注册它:

from extdirect.django import direct router,register懔router


class myrouter(directrouter):
def uppercase(self,word):
return word.upper()
def小写(self,word):
return word.lower()


register_router(myrouter,"remote")


register_router的参数是router类、客户端名称空间和/extdir下的可选url路由器
应该可用的ect(默认为类的名称)。




3。在根urlconf中,通过添加:

(r'^extdirect/',include('extdirect.django.urls')

4映射extdirect url。同样在根urlconf中,添加以下两行:

import extdirect.django as extdirect
extdirect.autodiscover()

5。在模板中,加载提供程序定义:

{%load direct_providers%}
{%direct_providers%}

>6。就是这样。您现在应该可以在该模板上访问remote
方法:

remote.myrouter.uppercase({word:'a word'},callback);





0.4
出于许可原因删除了stripped down direct.js/>添加请求批处理支持(感谢brian edwards,bedwards@zenoss.com)

zope中添加了提供的超时选项(感谢jon pierre gentil,
jgentil@zenoss.com)



0.3

eaner"extdirect.autodiscover()"


0.2
添加了django子包


0.1
初始发布,包括zope子包

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java线程;创建一个单独的线程来定期执行某些操作   用java将SonarQube升级到5.2失败。util。同时发生的CancellationException:空   在线程对象上调用start时,线程上设置的java优先级无效   java如何在不使用reduce()或last()折叠的情况下获取通量的最后一项   java如何从ArrayList中获取元素?   应用了逻辑的JavaTwitterAPI   在这种情况下,怎样才能不让自己重复?安卓的java   JavaAndroid:线程可运行和处理程序。在run方法中发布问题(Handler.postXX在预期情况下不会按时运行)   java log4j grok与管道故障   使用循环返回命令选项时出现问题/仅运行一个命令(JAVA)   java双重比较问题   使用vertx的JWT公钥/私钥身份验证中的java握手   用Java将WMA和AAC音频转换为MP3   解析字符串java get index   与具有不同数据类型的密钥同名的java JSON