我想要一个表单验证库
1.从表单验证中生成单独的html;
2.验证错误可以很容易地序列化,例如.作为json对象转储
你会在python web项目中选择什么形式的验证库?
好的,所以我使用mod_rewrite和PHP编写了一个REST API实现.我通过HTTP DELETE请求(...集体呻吟?)接受一个查询字符串.关于前两个语句的智慧的争论不谈,我发现PHP不会自动解析DELETE请求的请求体(即,尽管形式编码的查询字符串出现在请求体中,$ _POST仍为空).这并不特别让我感到惊讶.我发现令人惊讶的是,我一直无法找到用于解析查询字符串的内置PHP函数?我只是忽略了什么?我可以这样做:
public function parseQS($queryString, &$postArray){
$queryArray = explode('&', $queryString);
for($i = 0; $i < count($queryArray); $i++) {
$thisElement = split('=', $queryArray[$i]);
$postArray[$thisElement[0]] = htmlspecialchars(urldecode($thisElement[1]));
}
}
Run Code Online (Sandbox Code Playgroud)
...奇怪的是,没有PHP内置来处理这个问题.另外,我怀疑我不应该使用htmlspecialcharacters和urldecode来擦除表单编码的值...这是一种不同的编码,但是我也无法识别我应该使用哪种PHP函数来解码表单编码数据.
任何建议将不胜感激.
例如,让我们Schema以网站管理员设置所请求电话号码数量的用户为例:
class MySchema(Schema):
name = validators.String(not_empty=True)
phone_1 = validators.PhoneNumber(not_empty=True)
phone_2 = validators.PhoneNumber(not_empty=True)
phone_3 = validators.PhoneNumber(not_empty=True)
...
Run Code Online (Sandbox Code Playgroud)
不知怎的,我以为我可以做到:
class MySchema(Schema):
name = validators.String(not_empty=True)
def __init__(self, *args, **kwargs):
requested_phone_numbers = Session.query(...).scalar()
for n in xrange(requested_phone_numbers):
key = 'phone_{0}'.format(n)
kwargs[key] = validators.PhoneNumber(not_empty=True)
Schema.__init__(self, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
自从我在FormEncode文档中读到:
验证器使用实例变量来存储其自定义信息.您可以使用子类化或普通实例化来设置它们.
并Schema在docs中作为复合验证器调用,并且是一个子类,FancyValidator所以我猜它是正确的.
但是这不起作用:简单地添加phone_n被忽略并且仅name是必需的.
更新:
我也尝试了覆盖__new__,__classinit__然后在没有成功的问题之前......
如果要作为html表单数据提交,我想使用python dict对象并将其转换为等效的字符串。
该字典看起来像这样:
{
'v_1_name':'v_1_value'
,'v_2_name':'v_2_value'
}
Run Code Online (Sandbox Code Playgroud)
我相信表单字符串应如下所示:
v_1_name=v_1_value&v_2_name=v_2_value
Run Code Online (Sandbox Code Playgroud)
什么是这样做的好方法?
谢谢!
我有一个Pylons应用程序,并使用FormEncode和HtmlFill来处理我的表单.我的模板中有一系列文本字段(Mako)
<tr>
<td>Yardage</td>
<td>${h.text('yardage[]', maxlength=3, size=3)}</td>
<td>${h.text('yardage[]', maxlength=3, size=3)}</td>
<td>${h.text('yardage[]', maxlength=3, size=3)}</td>
<td>${h.text('yardage[]', maxlength=3, size=3)}</td>
<td>${h.text('yardage[]', maxlength=3, size=3)}</td>
<td>${h.text('yardage[]', maxlength=3, size=3)}</td>
<td>${h.text('yardage[]', maxlength=3, size=3)}</td>
<td>${h.text('yardage[]', maxlength=3, size=3)}</td>
<td>${h.text('yardage[]', maxlength=3, size=3)}</td>
</tr>
但是,我似乎无法弄清楚如何验证这些字段.这是我的架构的相关条目
yardage = formencode.ForEach(formencode.validators.Int())
我正在尝试验证每个字段都是Int.但是,这些字段不会进行验证.
更新 根据此处的要求,该控制器的操作代码.我知道它正在工作,因为我可以验证其他表单字段.
def submit(self):
schema = CourseForm()
try:
c.form_result = schema.to_python(dict(request.params))
except formencode.Invalid, error:
c.form_result = error.value
c.form_errors = error.error_dict or {}
c.heading = 'Add a course'
html = render('/derived/course/add.html')
return htmlfill.render(
html,
defaults = c.form_result,
errors = c.form_errors
)
else:
h.redirect_to(controler='course', action='view')
更新 …
formencode ×5
python ×4
api ×1
forms ×1
htmlfill ×1
php ×1
pylons ×1
query-string ×1
rest ×1
toscawidgets ×1
validation ×1
wtforms ×1