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,返回的字典将包含一个参数,即 person。person 变量将具有 fname、lname 和 age 属性。以下是如何使用 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 的变量的字典,该变量是一个记录列表。每个记录都将具有 fname 和 lname 属性。注意 records 转换器和 list:record 转换器之间的区别:前者将创建记录列表,而后者将生成单个记录,其 fname 和 lname 属性将每个都是一个值列表。
组合修饰符的顺序无关紧要;例如,: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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 062643757df63c09e9cb2086f09e3f785c353d4b706eff52ee3850ca7e8a85d8 |
|
MD5 | df409152d1722e63f1a877addff1eea6 |
|
BLAKE2b-256 | c7429cebaf9931df85d7f7e75975f1611c04e89f7286aa7d9bf7ee16353e1dd3 |