Flask Web表单


title: flask学习笔记
subtitle: 3. flask Web表单
date: 2018-12-14 10:17:28
---

Web表单

HTML表单是用户和web站点或应用程序之间交互的主要内容之一。它们允许用户将数据发送到web站点。大多数情况下,数据被发送到web服务器,但是web页面也可以自己拦截它并使用它。
HTML表单是由一个或多个小部件组成的。这些小部件可以是文本字段(单行或多行)、选择框、按钮、复选框或单选按钮。大多数情况下,这些小部件与描述其目的的标签配对——正确实现的标签能够清楚地指示视力正常的用户和盲人用户输入表单所需的内容。

HTML 表单-示例:

Flask-WTF插件

Flask-WTF插件来处理本应用中的Web表单,它对WTForms进行了浅层次的封装以便和Flask完美结合

配置

最基本的解决方案是使用app.config对象,它是一个类似字典的对象,可以将配置以键值的方式存储其中。松耦和,配置和应用代码分开放置

Flask及其一些扩展使用密钥的值作为加密密钥,用于生成签名或令牌。Flask-WTF插件使用它来保护网页表单免受名为Cross-Site Request Forgery或CSRF(发音为“seasurf”)的恶意攻击。
密钥被定义成由or运算符连接两个项的表达式。第一个项查找环境变量SECRET_KEY的值,第二个项是一个硬编码的字符串。这种首先检查环境变量中是否存在这个配置,找不到的情况下就使用硬编码字符串的配置变量的模式你将会反复看到。在开发阶段,安全性要求较低,因此可以直接使用硬编码字符串。但是,当应用部署到生产服务器上的时候,我将设置一个独一无二且难以揣摩的环境变量,这样,服务器就拥有了一个别人未知的安全密钥了。

config.py:
import osclass Config(object):SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'app/__init__.py:
from flask import Flask
from config import Configapp = Flask(__name__)
app.config.from_object(Config)from app import routes

配置2

CSRF_ENABLED 配置是为了激活 跨站点请求伪造 保护。在大多数情况下,需要激活该配置使得应用程序更安全些。
SECRET_KEY 配置仅仅当 CSRF 激活的时候才需要,它是用来建立一个加密的令牌,用于验证一个表单。当你编写自己的应用程序的时候,请务必设置很难被猜测到密钥。

config.py:
CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'app/__init__.py:
from flask import Flaskapp = Flask(__name__)
app.config.from_object('config')from app import views

Flask Web表单

Flask Web表单由三部分构成,用户登录表单,表单模板,表单视图。用户登录表单定义HTML网页上的数据。表单模板将表单添加到HTML模板以便渲染到网页。表单视图创建form实例,并将其传入渲染模板的函数中,然后用*/login* URL来关联它。

用户登录表单

# @File    : forms.py
# @Software: PyCharm# from flask_wtf import FlaskForm
# from wtforms import StringField, BooleanField
# from wtforms.validators import DataRequired
#
#
# class LoginForm(FlaskForm):
#     openid = StringField('openid', validators=[DataRequired()])
#     remember_me = BooleanField('remember_me', default=False)from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequiredclass LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired()])password = PasswordField('Password', validators=[DataRequired()])remember_me = BooleanField('Remember Me')submit = SubmitField('Sign In')

表单模板(.html文件)

HTML<\form>元素被用作Web表单的容器。 表单的action属性告诉浏览器在提交用户在表单中输入的信息时应该请求的URL。 当action设置为空字符串时,表单将被提交给当前地址栏中的URL,即当前页面。 method属性指定了将表单提交给服务器时应该使用的HTTP请求方法。 默认情况下是用GET请求发送,但几乎在所有情况下,使用POST请求会提供更好的用户体验,因为这种类型的请求可以在请求的主体中提交表单数据, GET请求将表单字段添加到URL,会使浏览器地址栏变得混乱。

<!-- extend from base layout -->
{% extends "base.html" %}{% block content %}
<h1>Sign In</h1>
{#<form action="" method="post" name="login">#}
{#    {{form.hidden_tag()}}#}
{#    <p>#}
{#        Please enter your OpenID:<br>#}
{#        {{form.openid(size=80)}}<br>#}
{#    </p>#}
{#    <p>{{form.remember_me}} Remember Me</p>#}
{#    <p><input type="submit" value="Sign In"></p>#}
{#</form>#}<form action="" method="post" novalidate>{{ form.hidden_tag() }}<p>{{ form.username.label }}<br>{{ form.username(size=32) }}</p><p>{{ form.password.label }}<br>{{ form.password(size=32) }}</p><p>{{ form.remember_me() }} {{ form.remember_me.label }}</p><p>{{ form.submit() }}</p></form>
{% endblock %}

表单视图

form.validate_on_submit()实例方法会执行form校验的工作。当浏览器发起GET请求的时候,它返回False,这样视图函数就会跳过if块中的代码,直接转到视图函数的最后一句来渲染模板。
当用户在浏览器点击提交按钮后,浏览器会发送POST请求。form.validate_on_submit()就会获取到所有的数据,运行字段各自的验证器,全部通过之后就会返回True,这表示数据有效。不过,一旦有任意一个字段未通过验证,这个实例方法就会返回False,引发类似GET请求那样的表单的渲染并返回给用户。稍后我会在添加代码以实现在验证失败的时候显示一条错误消息。

当form.validate_on_submit()返回True时,登录视图函数调用从Flask导入的两个新函数。 flash()函数是向用户显示消息的有效途径。 许多应用使用这个技术来让用户知道某个动作是否成功。我将使用这种机制作为临时解决方案,因为我没有基础架构来真正地登录用户。 显示一条消息来确认应用已经收到登录认证凭据,我认为对当前来说已经足够了。

登录视图函数中使用的第二个新函数是redirect()。这个函数指引浏览器自动重定向到它的参数所关联的URL。当前视图函数使用它将用户重定向到应用的主页。

# @File    : views.py
# @Software: PyCharm# from flask import render_template
# render_template函数需要传入模板名以及一些模板变量列表,返回一个所有变量被替换的渲染的模板。
from app import app
from flask import render_template, flash, redirect
from .forms import LoginForm# index view function suppressed for brevity
@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()# if form.validate_on_submit():#     flash('Login requested for OpenID="' + form.openid.data + '", remember_me=' + str(form.remember_me.data))#     return redirect('/index')# return render_template('login.html', title='Sign In', form=form)if form.validate_on_submit():flash('Login requested for user {}, remember_me={}'.format(form.username.data, form.remember_me.data))return redirect('/index')return render_template('login.html', title='Sign In', form=form)

转载于:https://www.cnblogs.com/gunxiaoshi/p/11052477.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一些PHP函数功能

函数 描述 PHP basename() 返回路径中的文件名部分。 3 chgrp() 改变文件组。 3 chmod() 改变文件模式。 3 chown() 改变文件所有者。 3 clearstatcache() 清除文件状态缓存。 3 copy() 复制文件。 3 delete() 参见 unlink() 或 unset()。 dirname() 返回路径中的目录名称部分…

mac java tomcat_mac idea 配置tomcat

mac idea 配置tomcat一、下载安装tomcat二、有一个 javaWeb项目创建一个javaWeb项目 ,参考第一条&#xff0c;只是在第二步的时候选中java Web就行三、完善web项目在WEB-INF 下新建两个文件夹&#xff0c;lib(存放jar包)和classes(存放编译后的文件)打开项目结构设置配置classe…

30342程序格式

1.汇编语言程序格式 2.表达式操作符 转载于:https://www.cnblogs.com/ZanderZhao/p/11055237.html

初识docker,弄清镜像和容器

前言&#xff1a; 之前总是有人拿虚拟机和容器做比较。我之前一直理解的容器&#xff0c;就类似于虚拟机快照类似。拿别人的东西就直接用了。在我的虚拟机中安装一下&#xff0c;环境就搞好了。其实容器是一个彻底解耦的东西。各个软件相互独立互不影响 什么是镜像 从docker本身…

configure 查找依赖库_Rust在编译Android的库时,如何设定依赖的第三方库引用的C/C++的动态库的搜索路径?...

谢邀。不懂android&#xff0c;也不懂OpenCL。但是我尝试了解了一下你的问题。既然你用了第三方库&#xff0c;那就得查源码了。翻开ocl 库的源码搜android关键字&#xff0c;很容易定位到下面代码。#https://github.com/cogciprocate/ocl/blob/master/ocl-interop/build.rs}el…

SprinBoot易学难精

Spring Boot易学难精 易学 组件自动装配&#xff1a;规约大于配置&#xff0c;专注核心业务外部化配置&#xff1a;一次构建、按需调配&#xff0c;到处运行嵌入式容器&#xff1a;内纸容器、无序部署、独立运行Spring Boot Stater&#xff1a;简化依赖、按需装配、自我包含Pro…

一道没人搞得定的趣味Shell编程游戏题!,看看你会不会?

1.1猜数字编程游戏首先让系统随机生成一个数字&#xff0c;给这个数字定一个范围&#xff08;1-60&#xff09;&#xff0c;让用户输入猜的数字&#xff0c;对输入进行判断&#xff0c;如果不符合要求&#xff0c;就给予高或低的提示。其他要求&#xff1a;1、全部猜对后则给出…

java中拷贝文件的代码_拷贝文件夹中的所有文件到另外一个文件夹

[java]代码库/**** 拷贝文件夹中的所有文件到另外一个文件夹** param srcDirector* 源文件夹** param desDirector* 目标文件夹**/public static void copyFileWithDirector(String srcDirector,String desDirector) throws IOException {(new File(desDirector)).mkdirs();Fil…

数据库IN查询参数化改造的方法

// 批量查询的 2019-05-14 if (!string.IsNullOrWhiteSpace(Request["userCodes"])){string userCodes Request["userCodes"].Replace("\r", "").Replace("&#xff0c;", ",").Replace(" ", "&q…

Docker镜像构成和定制

Docker镜像构成和定制 利用 commit 理解镜像构成 docker commit 命令应用场合 docker commit 命令除了学习之外&#xff0c;还有一些特殊的应用场合&#xff0c;比如被***后保存现场等。但是&#xff0c;不要使用 docker commit 定制镜像&#xff0c;定制镜像应该使用 Dockerfi…

孪生网络跟踪

github: https://github.com/foolwood/DaSiamRPN paper: https://arxiv.org/pdf/1808.06048.pdf http://openaccess.thecvf.com/content_cvpr_2018/papers/Li_High_Performance_Visual_CVPR_2018_paper.pdf转载于:https://www.cnblogs.com/heixialee/p/11064568.html

infoseccrypto_java下载_關於php接ICBC的支付接口的解決方案

一&#xff1a;背景&#xff1a; 目前項目使用的是php語言開發&#xff0c;需要接入中國工商銀行的ICBC的線上支付接口。二&#xff1a;遇到的問題&#xff1a;支付時需要對數據簽名&#xff0c;但是銀行那邊不提供php版本的程序&#xff0c;只有java版本的&#xff0c;以下是對…

AS 中 Plugin for Gradle 和 Gradle 之间的版本对应关系

Plugin for Gradle 和 Gradle 之间的版本对应关系 来源&#xff1a;https://developer.android.com/studio/releases/gradle-plugin.html Plugin versionRequired Gradle version1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 - 2.1.22.10 - 2.132.…

java bean 工厂模式_深入理解Java的三种工厂模式

一、简单工厂模式简单工厂的定义&#xff1a;提供一个创建对象实例的功能&#xff0c;而无须关心其具体实现。被创建实例的类型可以是接口、抽象类&#xff0c;也可以是具体的类实现汽车接口public interfaceCar {String getName();}奔驰类public class Benz implementsCar {Ov…

java windows 取所有任务_Win下,通过Jstack截取Java进程中的堆栈信息

在Java软件的使用过程中&#xff0c;有时会莫名的出现奇怪的问题。而这些问题常常无法使用日志信息定位&#xff0c;这时我们就需要通过查看进程内部线程的堆栈调用关系来分析问题出在哪里。举个例子&#xff0c;当我们在做某个操作时&#xff0c;莫名的会弹出多个警告框&#…

docker mysql Exit 1

用laradock启动mysql时&#xff0c;state总是 Exit 1 &#xff0c;docker-compose build后也没有效果 这时应该在&#xff5e;/.laradock/data&#xff08;.env的DATA_PATH_HOST路径&#xff09;下&#xff0c;把mysql的数据文件删除 这种情况常见于mysql安装多版本&#xff0c…

redis基础一_常用指令

# Redis configuration file example. # # Note that in order to read the configuration file, Redis must be # started with the file path as first argument: #./redis-server /path/to/redis.conf docker启动redis: docker run -d -p 6379:6379 -v /home/anmin/Desktop/…

滴滴Booster移动APP质量优化框架 学习之旅 三

推荐阅读&#xff1a; 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 滴滴Booster移动App质量优化框架-学习之旅 二对重复资源优化和无用资源优化进行了讨论。这里对不可编译无用assets资源优化进行讨论。 先看微信Matrix-ApkC…

java 最后的异常_java – 最后不要抛出堆栈溢出异常

Error不是例外.所以捕捉任何异常都不会捕获StackOverflowError.所以让我们先来看一下“明显的错误” – (这段代码不太适合这个答案后面的说明)&#xff1a;catch(Throwable e){System.out.println("Catch");}如果您进行此更改,您将发现代码仍然不打印.但是它不会打印…

Colder框架硬核更新(Sharding+IOC)

目录 引言控制反转读写分离分库分表 理论基础设计目标现状调研设计思路实现之过五关斩六将 动态对象动态模型缓存数据源移植查询表达式树深度移植数据合并算法事务支持实际使用展望未来引言 前方硬核警告&#xff1a;全文干货11000字&#xff0c;请耐心阅读 遥想去年这个时候&a…