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>
附加项列表中的每个项都应该是一个元组,其中:
> UL>
  • 属性名
  • 可调用对象(只接受一个必需参数)
  • 将为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>
    对于每个外键字段( fk_model ),您将获得两个具有相同值的属性:
    > UL>
  • FK U模型
  • fk_model_id
  • 更改

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

    推荐PyPI第三方库


    热门话题
    java Hibernate返回空列表而不是引发异常   java如何使用URLhttp://localhost:8080/appcontext/METAINF/index.html?   java如何在MaterialCalendarView中显示特定日期和时间的事件?   java如何使用Jsoup从html源代码中捕获一个特定文本?   java如何在jfree中从日志10切换到日志2   java无法理解IndexOutOfBoundsException   java在arraylist中将我选择的名称的布尔值设置为inactive,然后将它们存储在另一个数组中?   从文件中读取文本Java。输入流与读取器   java如何通过安卓 REST Web服务发送图像,并将其保存和从mysql数据库检索   java如何在Struts2中使用memcache来提高性能   java如何折射一个可以有两个流的类   在应用服务器中的maven模块之间共享java bean   关于“ciberin”java,如何知道字符数组索引的排列而不重复字母   安卓是否可以从未连接到xml的xml活动接收到java的EditText?   java如何在类a扩展类B扩展活动时正确使用findViewById   java如何在onActivityResult中获取上下文   java按名称获取对象方法不起作用   java获取appengine servlet的日志以显示