作者:李輝 鏈接:https://zhuanlan.zhihu.com/p/23340992 來源:知乎 著作權歸作者所有。商業(yè) |-guess.html |-base.html 基模板 |-venv/ 虛擬環(huán)境 實現(xiàn)代碼
app.py
```# -*- coding: utf-8 -*-import randomfrom flask import Flask, render_template, Flash, redirect, url_for, sessionfrom flask_wtf import Formfrom wtforms import IntegerField, SubmitFieldfrom wtforms.validators import Required, NumberRangefrom flask_bootstrap import Bootstrapapp = Flask(__name__)app.config['SECRET_KEY'] = 'very hard to guess string' #設置secret keybootstrap = Bootstrap(app) # 初始化Flask-Bootstap擴展@app.route('/')def index(): # 生成一個0~1000的隨機數(shù),存儲到session變量里。 session['number'] = random.randint(0, 1000) session['times'] = 10 return render_template('index.html')@app.route('/guess', methods=['GET', 'POST'])def guess(): times = session['times'] # 從session變量里獲取次數(shù) # 從session變量里獲取在index函數(shù)里生成的隨機數(shù)字 result = session.get('number') form = GuessNumberForm() if form.validate_on_submit(): times -= 1 session['times'] = times # 更新次數(shù)值 if times == 0: flash(u'你輸啦……o(>﹏<)o') return redirect(url_for('.index')) answer = form.number.data if answer > result: flash(u'太大了!你還剩下%s次機會' % times) elif answer < result: flash(u'太小了!你還剩下%s次機會' % times) else: flash(u'啊哈,你贏了!V(^-^)V') return redirect(url_for('.index')) return render_template('guess.html', form=form)class GuessNumberForm(Form): number = IntegerField(u'輸入數(shù)字(0~1000):', validators=[ # 傳入驗證函數(shù)和相應的錯誤提示信息。 Required(u'輸入一個有效的數(shù)字!'), NumberRange(0, 1000, u'請輸入0~1000以內的數(shù)字!')]) submit = SubmitField(u'提交')if __name__ == '__main__': # 用于heroku部署,本地可省略 app.run()index.html
{% extends "base.html" %}{% block page_content %}<!-- 傳入url_for的參數(shù)是視圖函數(shù)的名稱 --><a class="btn btn-success btn-lg" href="{{ url_for('guess') }}">開始游戲</a>{% endblock %}guess.html{% extends "base.html" %} <!-- 引入基模板 -->{% import "bootstrap/wtf.html" as wtf %}{% block page_content %} <!-- 使用Flask-Bootstrap提供的函數(shù)來生成默認樣式的表單 --> {{ wtf.quick_form(form) }}{% endblock %}完整的項目見源碼(底部)。
相關知識
session(會話) session是Flask的上下文(context)全局變量,可以用來存儲(用字典的形式)請求之間需要“記住”的值。在這個猜數(shù)字游戲里,我使用它來存儲生成的隨機數(shù)和剩余的機會次數(shù)。 要使用session,得先設置一個secret key,這用來給Cookie簽名以加密session,這樣做的效果是用戶可以看到cookie但不能篡改它。盡管如此,session并不是安全的,不能用來存儲密碼,這個視頻演示了一個破解session的過程:https://youtu.be/mhcnBTDLxCI。下圖是Cookie的信息:
更多細節(jié)見:http://flask.pocoo.org/docs/0.11/quickstart/#sessions
安裝和運行
源碼地址:https://github.com/helloflask/guess
下載或使用git命令克隆項目后,切換到程序根目錄。使用virtualenv創(chuàng)建一個虛擬環(huán)境,激活后使用pip安裝所需依賴:
pip install -r requirements.txt 然后運行:
set FLASK_APP=app.py flask run 訪問: http://127.0.0.1:5000/ 上面的代碼實現(xiàn)的效果:
稍微美化一下,變成了下面這樣:
源碼:https://github.com/helloflask/guess
Demo:http://guessguess.herokuapp.com/
新聞熱點
疑難解答