跳转到主要内容

WSGI表单字段打包器(源自Zope)

项目描述

repoze.monty是一个库,给定一个WSGI环境字典(如果请求是POST请求,则包含一个wsgi.input文件指针),将返回一个包含“转换”后的表单/查询字符串元素的字典。当表单元素名称带有特殊后缀时,请求中包含的表单和查询字符串元素将转换为简单的Python类型。

<form action=".">
   Age : <input type="hidden" name="age:int" value="20"/>
   <input type="submit" name="Submit"/>
</form>

同样,在URL的查询字符串中,您可以放入

http://example.com/mypage?age:int=20

在这两种情况下,当提供WSGI环境和wsgi.input文件指针,并要求返回值时,monty可能会返回如下字典

{'age':20}

repoze.monty是源自Zope 2的表单打包机的一般化版本。

表单/查询字符串元素打包

repoze.monty提供了一种方式,让您可以在表单中指定表单输入类型,而不是在您的应用程序代码中。您不需要在控制器或视图中将age变量转换为整数,您可以在表单本身中指示它是整数。

Age <input type="text" name="age:int" />

在表单输入名称后附加的 ‘:int’ 告诉 repoze.monty 在调用时将表单输入转换为整数。这个过程称为 序列化。如果用户在您的表单中输入的某些内容无法转换为整数(例如“22 going on 23”),则 Zope 将引发 ValueError。

以下是一个 repoze.monty 基本参数转换器的列表。

布尔型

将变量转换为真或假。变量为 0、None、空字符串或空序列时为假,所有其他变量都为真。

整数

将变量转换为整数。

长整数

将变量转换为长整数。

浮点数

将变量转换为浮点数。

字符串

将变量转换为字符串。大多数变量已经是字符串,因此此转换器很少使用。

文本

将变量转换为具有标准化换行符的字符串。不同平台上的不同浏览器对换行符的编码方式不同,因此此脚本确保换行符的一致性,无论它们是如何由浏览器编码的。

列表

将变量转换为 Python 列表。

元组

将变量转换为 Python 元组。

标记

通过在空白处分割字符串将字符串转换为列表。

通过在新行处分割字符串将字符串转换为列表。

必需

如果变量不存在,则引发异常。

忽略空值

如果变量是空字符串,则从请求中排除变量。

这些转换器以更多或更少相同的方式工作,将表单变量(字符串)强制转换为其他特定类型。

列表和元组转换器可以与其他转换器一起使用。这允许您将其他转换器应用于列表或元组的每个元素。考虑以下表单

<form action=".">

  <p>I like the following numbers</p>

  <input type="checkbox" name="favorite_numbers:list:int"
  value="1" /> One<br />

  <input type="checkbox" name="favorite_numbers:list:int"
  value="2" />Two<br />

  <input type="checkbox" name="favorite_numbers:list:int"
  value="3" />Three<br />

  <input type="checkbox" name="favorite_numbers:list:int"
  value="4" />Four<br />

  <input type="checkbox" name="favorite_numbers:list:int"
  value="5" />5<br />

  <input type="submit" />
</form>

通过同时使用列表和日期转换器,repoze.monty 将将每个选择的时间转换为日期,然后将所有选择日期组合到名为 favorite_numbers 的列表中。

更复杂类型的表单转换是将一系列输入转换为 记录。记录是具有属性的构造。使用记录,您可以组合多个表单输入到一个具有属性的变量中。可用的记录转换器包括

记录

将变量转换为记录属性。

记录列表

将变量转换为记录列表中的记录属性。

默认值

如果变量为空,则提供记录属性的默认值。

忽略空值

如果变量为空,则跳过记录属性。

以下是一些如何使用这些转换器的示例

<form action=".">

  First Name <input type="text" name="person.fname:record" /><br />
  Last Name <input type="text" name="person.lname:record" /><br />
  Age <input type="text" name="person.age:record:int" /><br />

  <input type="submit" />
</form>

如果此表单提交的信息传递给 repoze.monty,结果字典将包含一个参数 person。变量 person 将具有 fnamelnameage 属性。以下是如何使用 repoze.monty 处理表单提交的示例(假设您已经有一个 WSGI 环境)

from repoze.monty import marshal

info = marshal(environ, environ['wsgi.input'])
person = info['person']
full_name = "%s %s" % (person.fname, person.lname)
if person.age < 21:
    return ("Sorry, %s. You are not old enough to adopt an "
            "aardvark." % full_name)
return "Thanks, %s. Your aardvark is on its way." % full_name

记录转换器的工作方式类似于记录转换器,但它生成记录列表,而不仅仅是单个记录。以下是一个示例表单

<form action=".">

  <p>Please, enter information about one or more of your next of
  kin.</p>

  <p>
    First Name <input type="text" name="people.fname:records" />
    Last Name <input type="text" name="people.lname:records" />
  </p>

  <p>
    First Name <input type="text" name="people.fname:records" />
    Last Name <input type="text" name="people.lname:records" />
  </p>

  <p>
    First Name <input type="text" name="people.fname:records" />
    Last Name <input type="text" name="people.lname:records" />
  </p>

  <input type="submit" />
</form>

如果您使用此表单提交的信息调用 repoze.monty 的序列化方法,它将返回一个包含名为 people 的变量的字典,该变量是一个记录列表。每个记录都将具有 fnamelname 属性。注意 records 转换器和 list:record 转换器之间的区别:前者将创建记录列表,而后者将生成单个记录,其中属性 fnamelname 将是值列表。

组合修饰符的顺序不重要;例如,int:listlist:int 是相同的。

注意事项

传递给 repoze.monty 的序列化方法的文件指针将被消耗。从任何意义上讲,这意味着如果您打算在您的应用程序中使用 POST 文件输入数据,则在调用 marshal 之前,您应该创建一个临时文件的 wsgi.input 文件指针的副本。

报告错误/开发版本

访问 http://bugs.repoze.org 报告错误。访问 http://svn.repoze.org 下载开发版本或标记版本。

0.1

首次发布。

项目详情


下载文件

下载您平台上的文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。

源代码分发

repoze.monty-0.1.tar.gz (17.3 kB 查看哈希值)

上传时间 源代码

由以下提供支持