Django的外部直接实现
extdirect.django的Python项目详细描述
简介
这个包提供了一种简单的方法,将django中的函数/视图公开给 根据extjs.direct规范,extjs 3.0中包含的extjs.direct包
查看docs/install.txt、tests.py和test_url.py以查看所需的设置。
我们需要设置'uu name'变量才能访问函数。'uu module'稍后:
>>> __name__ = 'extdirect.django.doctest'
让我们创建一个测试浏览器:
>>> from django.test.client import Client >>> client = Client()
注册extdirect远程处理提供程序
现在,我们应该能够获得将注册的provider.js 我们的extdirect提供商。由于我们还没有注册任何函数,因此 操作 对于此提供程序,将是一个空的配置对象
>>> response = client.get('/remoting/provider.js/') >>> print response.content #doctest: +NORMALIZE_WHITESPACE Ext.onReady(function() { Ext.Direct.addProvider({"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}}); });
因此,在Web应用程序中注册ext.remotingprovider所需做的就是:
<script src="/remoting/provider.js/"></script>
直接访问描述符api
您可能希望访问extdirect远程处理的整个描述符api 供应商。在这种情况下,我们可以提出如下请求:
>>> response = client.get('/remoting/api/') >>> print response.content #doctest: +NORMALIZE_WHITESPACE Ext.ns('django'); django.Descriptor = {"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}}
注意,这个响应是javascript代码:
>>> print response.__getitem__('content-type') text/javascript
但是根据外部直接规范,我们也应该 能够将描述符api作为json包获取:
>>> response = client.get('/remoting/api/', {'format': 'json'}) >>> print response.content #doctest: +NORMALIZE_WHITESPACE {"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}, "descriptor": "django.Descriptor"}
为了确定:
>>> print response.__getitem__('content-type') application/json
使用Ext.Direct.RemotingProvider
从现在起,我们将使用config属性(config对象传递给 addprovider 函数:
>>> from pprint import pprint >>> from extdirect.django import remoting >>> from extdirect.django import tests >>> pprint(tests.remote_provider._config) {'actions': {}, 'namespace': 'django', 'type': 'remoting', 'url': '/remoting/router/'}
好的,现在我们要在我们的提供者实例上注册一个新函数( tests.remote\u provider ):
>>> __name__ = 'extdirect.django.doctest'0
默认情况下, formhandler 将设置为false, len 将设置为0,函数名将设置为 name
>>> __name__ = 'extdirect.django.doctest'1
请注意,extdirect有 操作 (控制器)和 方法 。但在这里,我们只有功能。 因此,我们使用:
>>> __name__ = 'extdirect.django.doctest'2
例如,"将 列表 函数添加到 用户 操作"。 但这是可选的,如果我们不设置 操作,默认值是function\u模块__ 属性(将"."替换为"\u")
需要注意的是,您传递给远程处理的签名不是 与服务器端相关。我们暴露给ext.direct的函数应该 像其他django视图一样,只接收 请求 instace。的参数 exposed函数将在 request.extdirect_post_data 中可用(当 函数它是一个表单处理程序(form_handler=true),所有参数都是 也可在 请求中找到。post )。
我们再注册几个函数:
>>> __name__ = 'extdirect.django.doctest'3
让我们看看提供商的配置对象:
>>> __name__ = 'extdirect.django.doctest'4
是时候打一个extdirect电话了。在我们的javascript中,我们只需编写:
>>> __name__ = 'extdirect.django.doctest'5
这将转换为POST请求:
>>> __name__ = 'extdirect.django.doctest'6
让我们检查一下响应:
>>> __name__ = 'extdirect.django.doctest'7
让我们尝试使用formhandler,您可能希望看到ext.direct表单集成 例如。
当我们运行时:
>>> __name__ = 'extdirect.django.doctest'8
ext.direct将发出这样的post请求:
>>> __name__ = 'extdirect.django.doctest'9
让我们检查一下响应:
>>> from django.test.client import Client >>> client = Client()0
如果您使用 文件上传 在extjs表单中,文件将在 request.files ,就像django处理文件上传一样
现在,我们要看看发生了什么例外情况。遵循外部直接规范 django将检查django是否在调试模式(settings.debug=true)下运行,并且 在这种情况下,它会将异常返回给浏览器。否则,例外情况必须是 被您公开的函数捕获。
首先,让我们公开一个引发异常的函数:
>>> from django.test.client import Client >>> client = Client()1
现在,我们模拟在调试模式下执行:
>>> from django.test.client import Client >>> client = Client()2
注意,在 where 属性中,您将拥有[filename,lineno,function,statment]以便 在调试时帮助您。
让我们看看如果关闭调试模式会发生什么情况:
>>> from django.test.client import Client >>> client = Client()3
引发的异常必须在服务器中捕获,而浏览器对此一无所知。
注册extdirect轮询提供程序
正如我们上面对extdirect远程处理提供程序所做的那样:
>>> from django.test.client import Client >>> client = Client()4
因此,在Web应用程序中注册ext.pollingprovider所需做的就是:
>>> from django.test.client import Client >>> client = Client()5
使用ext.direct.pollingprovider
在本节中,我们将展示如何使用ext.direct.pollingprovider。 ext.direct.pollingprovider,提供服务器在 不同的间隔(默认为3000-每3秒)。
由于我们没有为轮询提供程序设置函数,因此如果调用它,我们将得到一个异常:
>>> from django.test.client import Client >>> client = Client()6
但是,与extremotingprovider一样,当django处于调试模式时,异常是 返回浏览器:
>>> from django.test.client import Client >>> client = Client()7
因此,让我们声明一个简单的函数并将其分配给我们的轮询提供程序:
>>> from django.test.client import Client >>> client = Client()8
使用ExtDirectStore帮助程序类
extdirectstore这是一个帮助类,您可以使用它来加载给定的 extjs中的ext.data.directstore。
需要注意的是,在 命令使一切正常工作
让我们看看最简单的用例:
>>> from django.test.client import Client >>> client = Client()9
因此,一个快速且几乎完整的示例可以是:
在Django:
>>> response = client.get('/remoting/provider.js/') >>> print response.content #doctest: +NORMALIZE_WHITESPACE Ext.onReady(function() { Ext.Direct.addProvider({"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}}); });0
在extjs中:
>>> response = client.get('/remoting/provider.js/') >>> print response.content #doctest: +NORMALIZE_WHITESPACE Ext.onReady(function() { Ext.Direct.addProvider({"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}}); });1
正如我们在上面的示例中看到的,您可能希望将关键字参数传递给 方法查询以便筛选查询:
>>> response = client.get('/remoting/provider.js/') >>> print response.content #doctest: +NORMALIZE_WHITESPACE Ext.onReady(function() { Ext.Direct.addProvider({"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}}); });2
您可以更改(或在创建时设置)extdirectstore使用的关键字:
>>> response = client.get('/remoting/provider.js/') >>> print response.content #doctest: +NORMALIZE_WHITESPACE Ext.onReady(function() { Ext.Direct.addProvider({"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}}); });3
如果您使用分页,extdirectstore会注意:
>>> response = client.get('/remoting/provider.js/') >>> print response.content #doctest: +NORMALIZE_WHITESPACE Ext.onReady(function() { Ext.Direct.addProvider({"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}}); });4
同样,您可以将关键字 start 和 limit 更改为您想要的任何内容:
>>> response = client.get('/remoting/provider.js/') >>> print response.content #doctest: +NORMALIZE_WHITESPACE Ext.onReady(function() { Ext.Direct.addProvider({"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}}); });5
还包括排序:
>>> response = client.get('/remoting/provider.js/') >>> print response.content #doctest: +NORMALIZE_WHITESPACE Ext.onReady(function() { Ext.Direct.addProvider({"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}}); });6
你猜怎么着…?您也可以更改此关键字:
>>> response = client.get('/remoting/provider.js/') >>> print response.content #doctest: +NORMALIZE_WHITESPACE Ext.onReady(function() { Ext.Direct.addProvider({"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}}); });7
最后,有时需要运行复杂的查询。我们有两个选择。 首先,可以向extdirectstore传递或设置一个 extras 参数。这应该是 元组如下:
>>> response = client.get('/remoting/provider.js/') >>> print response.content #doctest: +NORMALIZE_WHITESPACE Ext.onReady(function() { Ext.Direct.addProvider({"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}}); });8 < DL>
将为queryset中的每个对象执行每个元组中的可调用对象 以获取该属性的值。
运行复杂查询的第二个选项非常简单。
>>> response = client.get('/remoting/provider.js/') >>> print response.content #doctest: +NORMALIZE_WHITESPACE Ext.onReady(function() { Ext.Direct.addProvider({"url": "/remoting/router/", "type": "remoting", "namespace": "django", "actions": {}}); });9
在这里,我们只需要向 query 函数传递一个有效的queryset。使用此 ExtDirectStore的QuerySet将应用我们已经看到的所有内容 (过滤、分页、排序)。您可以使用 所有django orm特性,然后将其传递给方法 query
最后,让我们看看在模型中定义foreignkey时会发生什么情况:
<script src="/remoting/provider.js/"></script>0 < DL>