flask web 编程学习笔记3:表单


表单作为一个常用的html选项,flask使用flask-WTF实现了常用的表单功能,实现简单方便。

复制代码,并执行,可以在浏览器中看到输入框:

  1. ''' 
  2.     Note3. WTF And Example 
  3. '''  
  4. #  
  5. #########################################################################  
  6. #  
  7. #     使用Flask-WTF可以处理表单,按照如下方式进行安装:  
  8. # pip install flask-wtf  
  9. #  
  10. #########################################################################  
  11. #  
  12. from flask import Flask, render_template, session, redirect, url_for, flash  
  13. # wtf about import file  
  14. from flask.ext.wtf import Form  
  15. from wtforms import StringField, SubmitField  
  16. from wtforms.validators import Required  
  17. from flask.ext.bootstrap import Bootstrap  
  18. #  
  19. app = Flask(__name__)  
  20. #  
  21. # 1) Flask-WTF 能保护所有表单免受跨站请求伪造(Cross-Site Request   
  22. # Forgery,CSRF)的攻击。恶意网站把请求发送到被攻击者已登录的其他网站时  
  23. # 就会引发CSRF 攻击。  
  24. # 2) 为了实现CSRF 保护,Flask-WTF 需要程序设置一个密钥。Flask-WTF使用  
  25. # 这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪。  
  26. #  
  27. app.config['SECRET_KEY'] = 'hard to guess string'  
  28. #  
  29. bootstrap = Bootstrap(app)  
  30. #  
  31. class NameForm(Form):  
  32.     #  
  33.     # 使用Flask-WTF 时,每个Web 表单都由一个继承自Form 的类表示。  
  34.     # NameForm 表单中有一个名为name的文本字段和一个名为submit的提交按钮。  
  35.     # Form 基类由Flask-WTF扩展定义,所以从flask.ext.wtf中导入。字段和验  
  36.     # 证函数却可以直接从WTForms 包中导入。  
  37.     #  
  38.     name = StringField('What is your name?', validators=[Required()])  
  39.     submit = SubmitField('Submit')  
  40.   
  41. # Form支持的字段:  
  42. # |----------------------------------------------------------------------  
  43. # | 字段类型            | 说  明  
  44. # |----------------------------------------------------------------------  
  45. # | StringField         | 文本字段  
  46. # | TextAreaField       | 多行文本字段  
  47. # | PasswordField       | 密码文本字段  
  48. # | HiddenField         | 隐藏文本字段  
  49. # | DateField           | 文本字段,值为datetime.date 格式  
  50. # | DateTimeField       | 文本字段,值为datetime.datetime 格式  
  51. # | IntegerField        | 文本字段,值为整数  
  52. # | DecimalField        | 文本字段,值为decimal.Decimal  
  53. # | FloatField          | 文本字段,值为浮点数  
  54. # | BooleanField        | 复选框,值为True 和False  
  55. # | RadioField          | 一组单选框  
  56. # | SelectField         | 下拉列表  
  57. # | SelectMultipleField | 下拉列表,可选择多个值  
  58. # | FileField           | 文件上传字段  
  59. # | SubmitField         | 表单提交按钮  
  60. # | FormField           | 把表单作为字段嵌入另一个表单  
  61. # | FieldList           | 一组指定类型的字段  
  62. # |------------------------------------------------------------------------  
  63. # WTForms 内建的验证函数:  
  64. # |------------------------------------------------------------------------  
  65. # | 验证函数        | 说  明  
  66. # |------------------------------------------------------------------------  
  67. # | Email           | 验证电子邮件地址  
  68. # | EqualTo         | 比较两个字段的值;常用于要求输入两次密码进行确认的情况  
  69. # | IPAddress       | 验证IPv4 网络地址  
  70. # | Length          | 验证输入字符串的长度  
  71. # | NumberRange     | 验证输入的值在数字范围内  
  72. # | Optional        | 无输入值时跳过其他验证函数  
  73. # | Required        | 确保字段中有数据  
  74. # | Regexp          | 使用正则表达式验证输入值  
  75. # | URL             | 验证URL  
  76. # | AnyOf           | 确保输入值在可选值列表中  
  77. # | NoneOf          | 确保输入值不在可选值列表中  
  78. # |------------------------------------------------------------------------  
  79. #  
  80.   
  81.   
  82. @app.route('/', methods=['GET', 'POST'])  
  83. def index():  
  84.     # 用户第一次访问程序时,服务器会收到一个没有表单数据的GET 请求,  
  85.     # 所以validate_on_submit() 将返回False。if 语句的内容将被跳过,  
  86.     # 通过渲染模板处理请求,并传入表单对象和值为None 的name 变量作  
  87.     # 为参数。用户会看到浏览器中显示了一个表单。  
  88.     name = None  
  89.     form = NameForm()  
  90.     # 提交表单后,如果数据能被所有验证函数接受,那么validate_on_submit()   
  91.     # 方法的返回值为True,否则返回False。  
  92.     if form.validate_on_submit():  
  93.         name = form.name.data          
  94.         form.name.data = ''          
  95.     return render_template('wtf.html', form=form, name=name)  
  96.       
  97.     ''' 
  98.     or : 重定向的方式,采用session记录上下文。 
  99.         session['name'] = form.name.data 
  100.         return redirect(url_for('index')) 
  101.     return render_template('wtf.html', form=form, name=session.get('name')) 
  102.      
  103.     or : flash 消息用来提示客户状态值。 
  104.         if old_name is not None and old_name != form.name.data: 
  105.             flash('Looks like you have changed your name!') 
  106.             session['name'] = form.name.data 
  107.             return redirect(url_for('index')) 
  108.     return render_template('index.html',\ 
  109.                            form = form,\ 
  110.                            name = session.get('name')) 
  111.     '''  
  112. # 注,传递flash消息时,需要修改html,增加:{% for message in get_flashed_messages() %}      
  113.       
  114. if __name__ == '__main__':  
  115.     app.run(debug=True)  

发表评论

电子邮件地址不会被公开。 必填项已用*标注