一个简单的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
- 火狐
- 铬
- 野生动物园