在使用之前预处理表单数据

时间:2012-07-03 20:09:33

标签: python web2py

我需要将一些HTML表单数据发送到python脚本,以便在web2py应用程序中进行格式化,但不知道如何执行此操作。用户将数据输入HTML表单。数据被发送到一个脚本,在那里它被清理和标记化。修改后的数据被发送到另一个python函数,在那里使用它。我该怎么做?是否每个python函数都进入default.py控制器,还是应该创建一个新的.py文件来处理表单数据?我在这里有一个例子。这会将搜索词作为用户输入并将其发送到结果页面。在将它发送到结果页面之前,我如何将它发送到python脚本?我真的很困惑!

的index.html:

<div id="MainArea">
  <p align="center">MY SEARCH ENGINE</p>
  <form name="form1" method="get" action="results.html">
    <label for="SearchBar"></label>
    <div align="center">
      <input name="query" type="text" id="SearchBar" value="" size = "100px"><br />
      <input name="submit" type="submit" value="Search">
    </div>
  </form>
  <p align="center">&nbsp;</p>

</div>

results.html

{{extend 'layout.html'}}
<h1>This is the default/results.html template</h1>
{{=BEAUTIFY(response._vars)}}

<div>{{=results}}</div>

default.py:

import urllib2

def index():
    return dict()

def results():
    address = "http://www.blekko.com/?q=%(query)s+/json&auth=<mykey>" % dict(query=request.vars.query)
    response = urllib2.urlopen(address)
    html=response.read()
    return html

1 个答案:

答案 0 :(得分:4)

看起来您使用的是内置表单机制。我很好奇 - 您究竟需要如何清理数据?

通常,您将使用构建表单的函数创建一个控制器文件,并且还有一个分支来处理它。在您的数据模型中,您将指定可接受的输入,并在表单处理函数(控制器函数)中操作数据。

您也可以使用

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”)。我建议将脚本放在应用程序中//私有/并使用request.folder获取应用程序所在的文件夹,然后只关注私有...所以类似:

execfile(os.path.join(request.folder, 'private', 'script.py'))

但是你必须验证能为你找到正确的道路。

编辑(验证表格):查看有关如何制作数据模型和使用表单/验证器(http://web2py.com/books/default/chapter/29/7)的web2py一书。定义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”)),并允许您立即创建一个好看的表单。请注意,有许多选项参数。

您也可以直接跳过数据库并制作表单,但我会让您在文档中查看:)