看起来您没有使用内置的表单机制。我很好奇——您究竟需要如何清理数据?
通常,您会创建一个控制器文件,其中包含一个构建表单的函数,并且还有一个分支来处理它。在您的数据模型中,您将指定可接受的输入,并在表单处理函数(控制器函数)中操作数据。
你也可以使用
form.process(..., onvalidation=some_func)
onvalidation 是一个可以进一步处理表单的函数,在将值存储到 DB 之前创建/操作值(或者您根本不能将它们存储在 DB 中),并进行进一步的验证。
请参阅:http ://web2py.com/books/default/chapter/29/7#onvalidation
Web2py 表单一般会自行提交并设置会话密钥以防止重复提交等。您这样做的方式必须确保在没有会话的情况下使用 form.accepts(...) 或跳过 web2py form.accepts/form.process 并仅使用 request.vars.field_name_that_you_provided 来获取表单字段数据. 然后你必须自己验证数据。
我建议创建一个 web2py 模型(models/form.py),或者至少在负责显示和处理表单的控制器文件中使用 web2py 的 FORM 助手创建表单。
这是 web2py 方式——一个返回表单以填写或处理它的单个函数。如果一切正常,您可以使用重定向将它们发送到另一个页面。
def display_form():
form = FORM('Your name:',
INPUT(_name='name', requires=IS_NOT_EMPTY()),
INPUT(_type='submit'))
if form.process().accepted:
session.flash = 'form accepted'
redirect(URL('next'))
elif form.errors:
response.flash = 'form has errors'
else:
response.flash = 'please fill the form'
return dict(form=form)
另一种方法是:
def process_form():
validated_data = dict()
for k,v in request.vars.values(): # I think this works...
if k == 'some_key':
do_some_processing()
...
validated_data[k] = some_func(v)
...
# now everyhing is validated and ok, send the data on
redirect('next_page', vars=validated_data)
重定向会将经过验证的表单数据发送到下一个函数。如果您不需要将其发送到 web2py 函数,则执行 process_form 函数所需的任何函数。
有道理?
编辑:另一种说法是脚本内容应该在表单处理函数中执行。您可以定义由同一控制器文件中的另一个函数显式执行的控制器函数。它不会有关联的视图,也不会是一个独立的页面,而只是一个功能。
您也可以使用 execfile("path/to/file")。我建议将脚本放在 applications//private/ 中,并使用 request.folder 来获取应用程序所在的文件夹,然后再添加私有...所以类似于:
execfile(os.path.join(request.folder, 'private', 'script.py'))
但是您必须验证是否可以找到正确的路径。
编辑(验证表单):查看有关如何制作数据模型和使用表单/验证器的 web2py 书(http://web2py.com/books/default/chapter/29/7)。当您定义 web2py 数据模型时,您可以直接在字段定义中包含验证器。这样,数据库将知道它是整数还是字符串,并且您可以在输入上强制长度或正则表达式模式。优点是您创建的表单:
form = SQLFORM(db.some_table)
甚至:form = SQLFORM.factory(Field('some_field', 'integer'), Field('some_str', 'string', requires=IS_ALPHANUMERIC))
验证非常简单——整数类型的字段将立即删除输入的任何非数字值,即使您修改了源代码或发送了带有错误值的 POST/GET 请求,form.process(...) 方法会使它无效并允许您轻松突出显示错误。
这是一个示例表单定义:
db.define_table('news_item',
Field('title', 'string', label='Title', requires=IS_NOT_EMPTY()),
Field('type', 'string', label='Type', requires=IS_IN_SET(news_types)),
Field('pub_date', 'date', default=request.now),
Field('post_date', 'date', default=request.now), # Set date defaults
Field('link', 'string', label='News Link', requires=IS_EMPTY_OR(IS_URL())),
Field('img', 'upload', uploadfield='img_file', label='Story Title Image'),
Field('img_file', 'blob', label='Story Title Image'),
Field('tagline', 'text', label='Tagline', requires=IS_NOT_EMPTY()),
Field('published', 'boolean', label='Published?', notnull=True, required=True),
)
这将在程序前面定义的数据库中创建一个名为 news_item 的表 (db = DAL("...connection string") ),并允许您立即创建一个漂亮的表单。请注意,有许多选项参数。
您也可以跳过数据库并直接制作表格,但我会让您在文档中查找:)