web.py——简单而且功能强大的Python web 框架(4):生成表单、获取输入和内容的验证

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42415326/article/details/89791185

web.py的form模块能够帮助你生成HTML表单;获取用户的输入,并在处理或添加到数据库之前对其进行内容的验证。

表单简介

web.py的表单模块允许生成html表单,获取用户输入,并在处理或将其添加到数据库之前对其进行验证。

表单模块定义了2个主要类:Form类和Input类。表单使用一个或多个输入和可选验证器进行实例化。输入使用名称变量以及可选参数和验证器进行实例化。Input类被子类化为以下html输入(parens中的html类型):

1.Textbox - free form single line input (input type=”text”)
2.Password - free form single line that hides input (input type=”password”)
3.Textarea - free form multi line input (textarea)
4.Dropdown - mutually exclusive input for lists (select and options)
5.Radio - mutually exclusive input for a few options (input type=”radio”)
6.Checkbox - binary input (input type=”checkbox”)
7.Button - submit the form (button)

基本登录表单如下所示:

login = form.Form(
    form.Textbox('username'),
    form.Password('password'),
    form.Button('Login'),
)

这定义了一个基本形式。一旦定义,你应该再次调用它来获取一个复制的实例,然后你可以在其上调用render方法,如下所示:

f = login()
print(f.render())

这将输出以下HTML:

<table>
    <tr><th><label for="username">username</label></th><td><input type="text" id="username" name="username"/><div class="post" style="display: none;"></div></td></tr>
    <tr><th><label for="password">password</label></th><td><input type="password" id="password" name="password"/><div class="post" style="display: none;"></div></td></tr>
    <tr><th><label for="Login"></label></th><td><button id="Login" name="Login">Login</button><div class="post" style="display: none;"></div></td></tr>
</table>

界面显示就如下:
在这里插入图片描述

实现输入功能

表单输入支持几个附加属性。例如:

form.textbox("firstname",
    form.notnull,            #首先放置验证器,然后是可选属性
    class_="textEntry",      #给文本框一个类名 - 注意下划线
    pre="pre",               #直接在文本框之前
    post="post",             #直接在文本框后面
    description="please enter your name",   #描述字段,默认为表单名称(“firstname”)
    value="bob",             #默认值
    id="nameid",             #指定id
)

除了上述属性之外,还可以以相同的方式输入任何html属性。例如:

myform2 = form.Form(
        form.textbox('phonenumber',
        size="12",
        maxlength="12"        )
)

实现下拉菜单:
下拉输入允许下拉列表中每个项目设置唯一的描述和值,为此,使用如下所示的元组创建下拉列表:

form.Dropdown('mydrop', [('value1', 'description1'), ('value2', 'description2')])

表格特征

除了单独的输入验证器,form模块还支持整个表单验证,允许比较字段。验证器作为变量’validators’(列表)传递:

signup = form.Form(
    form.Textbox('username'),
    form.Password('password'),
    form.Password('password_again'),
    validators = [form.Validator("Passwords didn't match.", lambda i: i.password == i.password_again)]
)

表单数据发布后,可以轻松地将其放入数据库(需要保证数据库方案的名称与您的webpy表单一致)。例如:

def POST(self):
    f = myform()
    if f.validates():
        web.insert('data_table', **f.d)
    #不要使用web.insert('data_table',** web.input())因为这样就可能提交恶意数据
    else:
        render.foo(f)

下面给出一个完整栗子:

#导入模块
import web
from web import form

#模板
render = web.template.render('templates/')

#url映射
urls = ('/', 'index')

#表单
myform = form.Form( 
    form.Textbox("boe"), 
    form.Textbox("bax", 
        form.notnull,
        form.regexp('\d+', 'Must be a digit'),
        form.Validator('Must be more than 5', lambda x:int(x)>5)),
    form.Textarea('moe'),
    form.Checkbox('curly'), 
    form.Dropdown('french', ['mustard', 'fries', 'wine'])
    ) 

class index: 
    def GET(self): 
        form = myform()
        # 确保通过调用它来创建表单的副本(上面一行)
        # 否则更改将全局显示
        return render.formtest(form)

    def POST(self): 
        form = myform() 
        if not form.validates(): 
            return render.formtest(form)
        else:
            # form.d.boe和form ['boe'].value是等价的方式
            # 从表单中提取经过验证的参数。
            return "Grrreat success! boe: %s, bax: %s" % (form.d.boe, form['bax'].value)

if __name__=="__main__":
    web.internalerror = web.debugerror
    app = web.application(urls, globals())
    app.run()

并且示例formtest.html(将其放在templates子目录中)如下:

$def with (form)

<form name="main" method="post"> 
$if not form.valid: <p class="error">Try again, AmeriCAN:</p>
$:form.render()
<input type="submit" />    </form>

猜你喜欢

转载自blog.csdn.net/qq_42415326/article/details/89791185