1. 程式人生 > >用python flask搭建一個網站[三]——表單

用python flask搭建一個網站[三]——表單

與使用者互動是網頁的一個基本功能。而互動的方式基本就是接受使用者資訊並進行相應的反饋。

表單就是最基本的接受使用者資訊的方式。

我先參考了《Flask Web Development》中對於Form的介紹。

它引入了一個flask-wtf的package(安裝命令pip install flask-wtf)。

在程式碼中加入

from flask.ext.wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required

class NameForm(Form):
    name = StringField('What is your name?', validators=[Required()])
    submit = SubmitField('Submit')

然後修改處理函式
@app.route('/', methods=['GET', 'POST'])
def index():
    form = NameForm()
    if form.validate_on_submit():
        print form.name.data
        form.name.data = ''
    return render_template('index.html', form=form)

這裡NameForm是作為index.html的輸入引數。

再來看index.html是如何組織的:

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky{% endblock %}
{% block page_content %}
{{ wtf.quick_form(form) }}
{% endblock %}
在倒數第二行呼叫了輸入引數form來組織html中form的內容。再看之前的程式碼form是NameForm的例項,NameForm有2個變數,name和submit,name應該是輸入文字的輸入框,submit應該提交的button。

執行程式碼後看實際頁面,奇怪,怎麼是Internal Server Error,再看命令列返回程式碼,居然是500。

研究了好久,最後發現,需要新增一行

app.config['SECRET_KEY'] = 'any string'

這個是一個加密金鑰,長度和內容都可以隨意設定。最初用於flask的cookies內容加密,後來被其他flask相關的第三方擴充套件。看來呼叫form的時候也需要加入這個東西。

加入之後再執行程式碼,訪問之後得到介面:


輸入任意名稱後,看到命令列中有列印輸入的內容:


這個方法有個問題,網頁的組合需要靠伺服器來執行,而且如果要加入javascrpt方法,又需要提前知道方法名稱,這樣整體看起來比較混亂。

那麼能否在HTML中組織form,伺服器程式只負責接收和處理資料呢?

答案是肯定的。

這時就需要request中的資料。

我們先來組織網頁:

{% extends "base.html" %}


{% block title %}Flasky{% endblock %}

{% block page_content %}
<form name="input" method="POST">
    target: <input type="text" name="_target" size="40">
    <input type="submit" value="Submit">

</form>
{% endblock %}
這裡我們去掉了有關wtf的內容,加入了一個form

同時重新組織伺服器的處理函式:

@app.route('/', methods=['GET', 'POST'])
def index():
    # form = NameForm()
    # if form.validate_on_submit():
    #     print form.input_data.data
    #     form.input_data.data = ''
    # return render_template("accept_target.html", form=form)
    if request.method == "POST":
        print request.form
    return render_template("accept_target_without_form_variable.html")

這裡我們先看request.form中的內容



打印出來的內容是Dict,key是_target,內容是zzz

參看上面的form中內容,看來key是input的name。

列印內容zzz只需要把print那一行修改為

print request.form['_target']

總結

這一次我們講了flask中的表單,有2種實現方式

1.呼叫flask-wtf package在伺服器程式中建立表單並作為引數傳遞給html檔案

2.直接在HTML中加入表單,在伺服器程式中通過request.form[form_input_name]來訪問表單內容