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.pswp.cn/news/277501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277501.shtml
英文地址,請注明出處:http://en.pswp.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…