一个简单的python egg和jquery插件,可以在django/plone/中轻松使用jquery。网站。

jquery.pyprox的Python项目详细描述


jquery.pyproxy

pyproxy的目标是帮助将ajax调用与jquery集成 在python驱动的站点中。 主要思想是在python调用中使用jquery语法 更新用户看到的页面。这样,你不必 将复杂数据返回到javascript客户端,该客户端将不得不解密 它们,

重要提示:产品尚未定稿,可能无法在 任何情况。

安装

将jquery.pyproxy添加到buildout egs并运行buildout,如果 不要使用buildout,您可以轻松地安装jquery.pyproxy(或者 通常与其他产品一起使用)。

在plone中,转到quickinstaller并安装jquery.pyproxy。那是 所有,快乐的plone用户现在可以跳到"简单示例"。

在django中,您还应该将django appmedia添加到构建鸡蛋中 以及appmedia的已安装应用程序列表。先建完,然后跑 Bin/Django SymlinkMedia公司。 现在在您的模板中,添加:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.min.js"></script>

如果希望在请求 完成后,您还可以添加标题:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.min.js"></script>
<link rel="stylesheet" href="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.css" type="text/css" media="screen">

您需要在 网站。如果不是(或者如果您的媒体文件托管在不同的 子域),您应该声明一个名为 指向文件url的pyproxy微调器位置。这个 声明应在包含 jquery.pyproxy.spinner.js 文件。

如果不想使用app_media,可以下载javascript 来自github的库 ( https://github.com/vincent psarga/jquery.pyproxy/blob/master/jquery/pyproxy/media/jquery.pyproxy.min.js -请确保匹配egg版本和js版本)并安装 放到你的媒体文件夹里。然后你可以把它包含到你的 模板。

简单示例

一个简单的例子应该更容易解释背后的想法 jquery.pyproxy。您不希望用户必须重新加载整个页面 向博客提交评论时,将使用ajax调用。 下面是使用jquery.pyproxy执行此操作的方法。

首先,创建一个视图来管理用户发送的信息 (这里是django,但原理与plone相同):

from jquery.pyproxy.jq_django import JQueryProxy, jquery

# The @jquery decorator handles the transformation of your results
# into JSON so we can decode it on client side.

@jquery
def ajax_add_comment(request):
    # The JQuery proxy object helps us to manipulate the page the user sees.
    jq = JQueryProxy()
    # The data/form sent with Ajax just apear like a classical POST form.
    form = request.POST

    #we do some validation of the form.
    ...

    if errors:
        # We display an error message.
        jq('#my_error_message').show()
        return jq
    ...
    # We display a success message.
    jq('#my_success_message').show()

    # If the JQueryProxy object is not returned, nothing happens.
    return jq

最后,将jquery.pyproxy操作绑定到按钮 用于提交表单:

$(document).ready(function() {
  $('#submit_comment').pyproxy('click',
                               '/ajax_add_comment',
                               '#comment_form');
});

使用jQueryProxy对象

首先,您需要导入正确的jqueryproxy对象:

< Buff行情>
  • 如果使用plone:from jquery.pyproxy.plone import jqueryproxy
  • 如果使用django:from jquery.pyproxy.jq_django import jqueryproxy

两者都基于相同的对象,在base.py模块中定义:

>>> from jquery.pyproxy.base import JQueryProxy

这个项目背后的主要思想是能够使用相同的 语法比jquery好,所以您可以或多或少地复制粘贴一些 web上的示例或一些现有代码。 当然,由于我们使用的是python,因此不能将美元符号用作 标识符:

>>> $ = JQueryPyproxy()
Traceback (most recent call last):
...
SyntaxError: invalid syntax

因此,在我们的示例中,我们将对象声明为 jq ,这是经典的 plone命名jquery对象的方式:

>>> jq = JQueryProxy()

目前,jqueryproxy支持jquery 1.4的所有操作api 效果api。

< Buff行情>
>>> sorted(jq.grammar.keys())
['addClass', 'after', 'animate', 'append', 'appendTo',
 'attr', 'before', 'css', 'detach', 'empty', 'fadeIn',
 'fadeOut', 'fadeTo', 'find', 'hide', 'html', 'insertAfter',
 'insertBefore', 'parent', 'prepend', 'prependTo', 'remove',
 'removeAttr', 'removeClass', 'replaceAll', 'replaceWith',
 'show', 'slideDown', 'slideToggle', 'slideUp', 'text',
 'toggle', 'toggleClass', 'unwrap', 'wrap', 'wrapAll', 'wrapInner']

所以如果你知道如何在jquery中使用它们,你就知道如何使用它们 使用pyproxy,例如:

>>> jq('#error_msg').html('Errors have been found, please correct them')
>>> jq('#error_email').show()

jquery方法的声明方式与 jquery(除了回调之外,请参阅"限制"部分)。所以如果 如果使用不正确的参数,则python代码中会出现错误 (这在调试时应该有很大帮助,至少应该有 服务器日志):

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.min.js"></script>
0

如果你需要处理选择器,您可以使用 批处理 jQueryObject的方法。它需要五个参数:

< Buff行情>
  • 选择器列表
  • 应用的方法
  • 此方法的参数列表
  • 要在每个选择器之前添加的前缀(可选)
  • 将应用选择器的取代基列表(可选)

例如,当您要显示一个错误列表时:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.min.js"></script>
1

相当于:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.min.js"></script>
2

您还可以像在javascript端那样链接jquery调用:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.min.js"></script>
3

注意,我们还没有检查调用是否返回了可以 用链子拴住。

当您需要清楚地了解已完成的呼叫时 通过jq对象,您可以使用 list\u调用 方法:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.min.js"></script>
4

您可以看到,即使失败的调用也存储在这里(但不是 参数)。 这是因为我们是博士。在 真实的用例,当出现异常时,您的代码将在 问题已经找到。

扩展jquery代理

如果希望能够使用 默认情况下,必须扩展jQueryProxy已知的方法列表。 在我们的示例中,我们将考虑您希望使用 showDialog 方法。 默认情况下,它不工作(这是合乎逻辑的,因为pyproxy不工作 了解您正在使用的jquery插件:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.min.js"></script>
5

为了能够使用该方法,您需要定义 要使用的方法和所需的参数。 在这里,我们只定义了showDialog方法,它包含三个参数 (第一个是字符串或Unicode,第二个是int,字符串 或Unicode,最后一个是可选的措辞):

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.min.js"></script>
6

然后,您可以使用 扩展语法 方法来识别您的方法:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.min.js"></script>
7

当然,它尊重您定义的语法:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.min.js"></script>
8

如果您需要在所有ajax视图中使用自定义方法,那将非常痛苦。 每次都要扩展语法。 您可以选择解决这个问题。

1)如果使用jquery.pyproxy的源代码: 在jquery.pyproxy/jquery/pyproxy/plugins中添加一个名为 my_plugin.py 的文件。 在这个文件中,用前面解释过的措辞描述你的插件。 这个词必须叫做语法。

2)你不使用来源,只使用鸡蛋。 创建一个新的python类,子类化jqueryproxy。声明一 此对象中描述语法的基本语法属性:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.min.js"></script>
9

在您的视图中,使用这个类而不是jqueryproxy类。

3)在下一个版本中集成您的语法。 无论如何,请毫不犹豫地提交您定义的语法,以便它能够 集成到jquery.pyproxy的下一个版本中。

限制

目前有两个(至少)主要限制。

首先,不能存储选择器,如下所示:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.min.js"></script>
<link rel="stylesheet" href="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.css" type="text/css" media="screen">
0

看起来很好,但如果我们仔细观察 由jq对象存储,我们可以看到只有最后一个调用是 已保存,对"css({width':'200px'})"的调用将永远不会执行:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.min.js"></script>
<link rel="stylesheet" href="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.css" type="text/css" media="screen">
1

编写此代码的正确方法是:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.min.js"></script>
<link rel="stylesheet" href="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.css" type="text/css" media="screen">
2

现在,如果我们看看这个物体所储存的是什么,我们就会发现 调用:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.min.js"></script>
<link rel="stylesheet" href="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.css" type="text/css" media="screen">
3

第二个是回调没有被处理,所以不能使用 像这样:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.min.js"></script>
<link rel="stylesheet" href="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.css" type="text/css" media="screen">
4

即使jquery文档告诉show方法可以接受多个 参数(这是正确的,但不是在这里)。

有样品吗?

如果使用plone,请将以下内容添加到一个可用的 configure.zcml 文件(示例中来自主题的文件):

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.min.js"></script>
<link rel="stylesheet" href="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.css" type="text/css" media="screen">
5

重新启动实例,然后打开 http://localhost:8080/your plone\uite/pyproxy_示例

如果您使用django,稍后将添加一些示例。

测试模块

此包中嵌入了测试以确保其工作 正确地。要在python端运行测试,可以运行:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.min.js"></script>
<link rel="stylesheet" href="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.css" type="text/css" media="screen">
6

也有qunit测试来确保jquery库工作正常 相关的。目前它只对plone用户可用。第一, 必须从jquery.pyproxy加载"tests.zcml"文件。 例如,在您开发的产品的main configure.zcml中:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.min.js"></script>
<link rel="stylesheet" href="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.css" type="text/css" media="screen">
7

然后,在zmi中,转到portal_设置,然后输入 标签。选择列表中的jquery.pyproxy tests,选择皮肤 工具 步骤,然后单击导入选定步骤 。 在门户皮肤工具中,您应该看到一个名为 pyproxy_测试 。现在打开 http://localhost:8080/您的站点/pyproxy\u测试 请参阅正在运行的Qunit测试。

我使用python,但不使用django或plone

您应该使用django。

如果此解决方案不可接受,您仍然可以更新 @jquery decorator来处理您的框架。唯一 这个decorator所做的就是转换jqueryproxy对象 由函数返回到json。 要进行转换,此代码就足够了:

<script type="text/javascript" src="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.min.js"></script>
<link rel="stylesheet" href="{{MEDIA_URL}}/pyproxy/jquery.pyproxy.spinner.css" type="text/css" media="screen">
8

然后,必须根据 框架系统(例如,对于plone,我们只返回它,对于django 我们将其包装成一个httpresponse对象。

如果您将@jquery decorator移植到任何框架,请让我 要知道,这样它就可以集成到下一个版本中。

兼容性

测试时间:

< Buff行情>
  • jquery 1.2和1.4
  • python 2.4和2.6
  • 火狐
  • 野生动物园

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

推荐PyPI第三方库


热门话题
java无法使用JSF访问托管bean方法   java是制作具有多值类型的HashMap的正确方法   javafx中TicTacToe的java更新UI   windows Java文件。getCanonicalFile()无法处理冒号“:”   java在一个布局屏幕中创建多个(26)按钮   java Android Studio:Gradle构建完成,有251个错误   我们如何在Java上为callfireapiclient编写单元/集成测试?   java无法将1715UTC转换为本地/gmt类型   具有已定义的数字序列的JAVA循环   Java程序正在netbeans中编译,但未在CMD中编译,包不存在   java Android构造函数和onCreate()之间有什么区别?   java配置弹性搜索结果评分   java LibGDX纹理是否可绘制?   java如何在Android中设置应用程序默认打开pdf   java是否有一种创造性的方法将多个参数传递给contentEquals()方法?   java在Android上存储Ed25519私钥