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 将具有 fname、lname 和 age 属性。以下是如何使用 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 的变量的字典,该变量是一个记录列表。每个记录都将具有 fname 和 lname 属性。注意 records 转换器和 list:record 转换器之间的区别:前者将创建记录列表,而后者将生成单个记录,其中属性 fname 和 lname 将是值列表。
组合修饰符的顺序不重要;例如,int:list 与 list:int 是相同的。
注意事项
传递给 repoze.monty 的序列化方法的文件指针将被消耗。从任何意义上讲,这意味着如果您打算在您的应用程序中使用 POST 文件输入数据,则在调用 marshal 之前,您应该创建一个临时文件的 wsgi.input 文件指针的副本。
报告错误/开发版本
访问 http://bugs.repoze.org 报告错误。访问 http://svn.repoze.org 下载开发版本或标记版本。
0.1
首次发布。
项目详情
repoze.monty-0.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c604865ea974ee9620b964618ac5dd338e4599d2a7613d4e457d4f73dd64d209 |
|
MD5 | b90abb03624a86f77c82578582e60b67 |
|
BLAKE2b-256 | eea46feeac210545e2092d1e41fe736f8d89bd66d2183d68ceb7c2abfca55a01 |