跳转到主要内容

HTTP表单数据解析器

项目描述

zope.httpform 是一个库,给定一个 WSGI 或 CGI 环境字典,会返回一个包含转换后的表单/查询字符串元素的字典。当表单元素名称带有特殊后缀时,环境中的表单和查询字符串元素将被转换为简单的 Python 类型。例如,在一个你想用这个库处理的 HTML 表单中,你可能会说

<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 或 CGI 环境,并要求返回一个值时,这个库将返回一个类似的字典

{'age':20}

这个功能一直存在于 Zope 的发布者中,但现在它已被分解成这个小库,使其更容易解释、测试和使用。

表单/查询字符串元素解析

zope.httpform 提供了一种方法,允许你在表单中指定表单输入类型,而不是在应用程序代码中。你不需要在控制器或视图中将 age 变量转换为整数,你可以在表单本身中表明它是一个整数

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

附加到表单输入名称的 :int 告诉这个库在调用时将表单输入转换为整数。如果用户在上述情况下输入的内容不能转换为整数(例如,“22 going on 23”),那么这个库将引发一个 ValueError。

以下是一个标准参数转换器的列表。

:boolean

将变量转换为真或假。空字符串被评估为假,非空字符串被评估为真。

:int

将变量转换为整数。

:long

将变量转换为长整数。

:float

将变量转换为浮点数。

:string

将变量转换为字符串。大多数变量已经是字符串,所以这个转换器不常用,除非用于简化文件上传。

:text

将变量转换为带有规范化换行符的字符串。不同的浏览器在不同的平台上对行结束符的编码不同,所以这个脚本确保行结束符是一致的,无论它们是如何被浏览器编码的。

:list

将变量转换为 Python 列表。

:tuple

将变量转换为 Python 元组。

:tokens

通过在空白处断开来将字符串转换为列表。

:lines

通过在新行处断开来将字符串转换为列表。

:required

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

:ignore_empty

如果变量是空字符串,则将其从表单数据中排除。

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

:list:tuple 转换器可以与其他转换器一起使用。这允许你将额外的转换器应用到列表或元组的每个元素上。考虑以下表单

<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>

通过使用 :list:int 转换器一起,这个库将每个选定的项转换为整数,然后将所有选定的整数组合成一个名为 favorite_numbers 的列表。

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

:record

将变量转换为记录属性。

:records

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

:默认

当变量为空时,为记录属性提供一个默认值。

:ignore_empty

当变量为空时,跳过记录属性。

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

<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>

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

from zope.httpform import parse

info = parse(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

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

<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>

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

组合修饰符的顺序无关紧要;例如,:int:list:list:int 相同。

注意事项

传递给 zope.httpform.parse() 的文件指针将被消耗。从所有目的来看,这意味着您在调用 parse() 之前应该创建 wsgi.input 文件指针的 tempfile 复制,如果您打算在应用程序中使用 POST 文件输入数据。

致谢

本文档由 Agendaless Consulting 团队慷慨捐赠。预计 zope.httpform 软件包将取代 repoze.monty 软件包。

更改记录

版本 1.0.2 (2009-07-24)

  • 在发行版中包含软件包数据。

  • 默认使用 UTF-8 解码。

  • 修复了在 Python 2.6 上的测试失败。

版本 1.0.1 (2009-02-07)

  • 修复了一些误导性文档。

  • 放宽了对 REQUEST_METHOD 的要求,因为 zope.publisher 测试没有设置它。

  • 使用了来自 repoze.monty 的文档和设计思路。感谢 Chris 和 Agendaless。

版本 1.0.0 (2009-02-06)

  • zope.httpform 的第一个版本。从 zope.publisher 3.5.5 中提取。

项目详情


下载文件

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

源代码发行版

zope.httpform-1.0.2.tar.gz (18.7 kB 查看哈希值)

上传时间 源代码

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面