Author: 陳倫巨
Data: 2019-04-05
Email: 545560793@qq.com
github: https://github.com/smartisantt
一椒拗、安裝環(huán)境
1、使用virtualenv安裝
- 在D盤創(chuàng)建兩個(gè)文件夾英文名,代碼(workspace)和環(huán)境(env)兩個(gè)文件夾
- 進(jìn)入env 文件夾
D:
再輸入cd env
pip install virtualenv
- 創(chuàng)建一個(gè)叫flaskenv的虛擬環(huán)境名字
virtualenv --no-site-packages flaskenv
- 進(jìn)入文件
cd Scripts
- windows下輸入
activate
激活, Linux系統(tǒng)輸入source activate
-
pip list
或者pip freeze
可以查看當(dāng)前安裝環(huán)境 - 安裝
pip install flask
枉昏,也可以批量安裝第三方庫庆亡,新建一個(gè)txt文件里面每行寫安裝的第三方庫和對應(yīng)的版本今瀑,在終端進(jìn)入環(huán)境欢唾,輸入python install -r 文件名
- 退出環(huán)境deactivate
說明:為什么要使用virtualenv搏予?當(dāng)你有很多項(xiàng)目熊锭,同時(shí)使用不同版本的Python和第三庫的可能性也就越大。很悲觀的是:常常Python或第三方庫版本升級(jí),升級(jí)后有時(shí)不向下兼容碗殷。所以精绎,當(dāng)你創(chuàng)建一個(gè)項(xiàng)目的時(shí)候,virtualenv為每個(gè)項(xiàng)目提供一份Python安裝锌妻,它并沒有真正安裝多個(gè)Python副本代乃,但是他去世提供了一種巧妙的方式來讓各項(xiàng)目環(huán)境保持獨(dú)立。
2仿粹、flask的安裝與使用
先激活環(huán)境搁吓,再執(zhí)行pip install flask
Flask依賴兩個(gè)外部庫:Werkzeug和Jinja2。Werkzeug是一個(gè)WSGI(在Web應(yīng)用和多種服務(wù)器之間的標(biāo)準(zhǔn)Python接口)工具集吭历。Jinja2負(fù)責(zé)渲染模板堕仔。
說明:這里使用的Python3.3或更高的版本。
3晌区、啟動(dòng)
有兩種啟動(dòng)方式:
第一種:flask自帶的啟動(dòng)方式app.run(host, port, debug)
第二種:使用flask_script庫啟動(dòng)
pip install flask_script
from flask_script import Manager app = Flask(__name__) manage=Manager(app) manage.run()
在命令行中輸入:
python xxx.py runserver -h -p -d
二摩骨、快速入門
一個(gè)最小的 Flask 應(yīng)用看起來會(huì)是這樣:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__'
app.run()
把上面的文件保持為hello.py 文件(或是類似的),然后用Python解釋器來運(yùn)行:
(flask_env) H:\wordspace\flask\flask>python manage.py
* Serving Flask app "manage" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
注意:確保你的文件名不是flask.py朗若,因?yàn)檫@將與Flask本身沖突恼五。
現(xiàn)在訪問 http://127.0.0.1:5000/ ,你會(huì)看見 Hello World 問候哭懈。
那么上面的代碼做了什么灾馒?
from flask import Flask
導(dǎo)入了Flask類,這個(gè)類的實(shí)例將會(huì)是WSGI應(yīng)用程序
app = Flask(__name__)
银伟,創(chuàng)建一個(gè)該類的實(shí)例你虹,第一個(gè)參數(shù)是應(yīng)用模塊或者包的名稱。如果你使用單一的模塊彤避,你應(yīng)該使用__name__
,因?yàn)槟K的名稱將會(huì)因其作為單獨(dú)應(yīng)用啟動(dòng)還是作為模塊導(dǎo)入而有不同( 也即是 '__main__'
或?qū)嶋H的導(dǎo)入名)夯辖。
@app.route('/')
裝飾器告訴 Flask 什么樣的URL 能觸發(fā)我們的函數(shù)琉预。
app.run()
函數(shù)讓應(yīng)用運(yùn)行在本地服務(wù)器上。其中 if __name__ =='__main__':
確保服務(wù)器只會(huì)在該腳本被 Python 解釋器直接執(zhí)行的時(shí)候才會(huì)運(yùn)行蒿褂,而不是作為模塊導(dǎo)入的時(shí)候圆米。
欲關(guān)閉服務(wù)器,在命令行中按 Ctrl+C啄栓。
補(bǔ)充知識(shí):
Python 中有許多web框架娄帖,為了更好讀兼容性,python定義了web框架和web服務(wù)器之間讀接口昙楚,即
PEP-3333近速,PEP-333指定了服務(wù)器和Python web應(yīng)用程序或框架之間擬議的標(biāo)準(zhǔn)接口,以促進(jìn)跨各種web服務(wù)器的web應(yīng)用程序可移植性。
WSGI(全稱即:Python Web Server Gateway Interface)
用戶(client)發(fā)各種請求削葱,發(fā)送給server(gateway) 去call Application層(里面有各種各樣的object奖亚,比如函數(shù),class等)析砸,然后在返回個(gè)server在返回給user昔字,server和Application中間有middleware(中間件)。
三首繁、調(diào)試模式
調(diào)試模式:
雖然app.run()
方法適用于啟動(dòng)本地的開發(fā)服務(wù)器作郭,但是你每次修改代碼后都要手動(dòng)重啟它。這樣并不夠優(yōu)雅弦疮。
調(diào)試模式絕對不能用于生產(chǎn)環(huán)境K鳌!挂捅!
在flask自帶的啟動(dòng)方式中有兩種途徑啟動(dòng)調(diào)試模式:
第一種:
app.debug = True
app.run()
第二種:
app.run(debug=True)
兩種方法的效果完全相同芹助。當(dāng)你運(yùn)行程序的時(shí)候,修改您的代碼然后保存程序會(huì)自動(dòng)重啟闲先。
四状土、路由
route()
裝飾器把一個(gè)函數(shù)綁定到對應(yīng)的 URL 上。
基本例子:
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello World'
有變量的路由:
語法:<轉(zhuǎn)化器: 變量名>
轉(zhuǎn)化器有下面幾個(gè)
轉(zhuǎn)化器類型 | 說明 |
---|---|
int | 接受整數(shù) |
float | 接受整數(shù)和浮點(diǎn)數(shù) |
string | 指定字符串(默認(rèn)類型) |
<string:name>
和<name>
是一樣的效果伺糠。
@app.route('/echo/<msg>')
def echo(msg):
return '<h1>Hello, I am a Website I can echo everything: {}</h1>'.format(msg)
@app.route('/post/<int:post_id>')
def show_post(post_id):
return 'Post %d' % post_id
@app.route('/float/<float:num>')
def float(num):
return 'float num is : {:.2f}'.format(num)
看看下面的兩個(gè)例子蒙谓,雖然它們看起來著實(shí)相似,但它們結(jié)尾斜線的使用在 URL 定義 中不同训桶。
第一種情況中累驮,指向 projects 的規(guī)范 URL 尾端有一個(gè)斜線。這種感覺很像在文件系統(tǒng)中的文件夾舵揭。訪問一個(gè)結(jié)尾不帶斜線的 URL 會(huì)被 Flask 重定向到帶斜線的規(guī)范 URL 去谤专,然而,
第二種情況的 URL 結(jié)尾不帶斜線午绳,訪問結(jié)尾帶斜線的 URL 會(huì)產(chǎn)生一個(gè) 404 “Not Found” 錯(cuò)誤置侍。
# 第一種情況,URL結(jié)尾有斜線
@app.route('/projects/')
def projects():
return 'The project page'
# 第二種情況拦焚,URL結(jié)尾沒有斜線
@app.route('/about')
def about():
return 'The about page'
五蜡坊、獲取請求參數(shù)
get和post傳參:
HTTP協(xié)議未規(guī)定GET和POST傳參長度的限制,但是瀏覽器和web服務(wù)器對其有限制赎败,不同瀏覽器和web服務(wù)器限制的長度不一樣秕衙。
get傳參格式:127.0.0.1:80/login/?username=ququ&password=123
get是通過路由傳參數(shù),僵刮?后面的參數(shù)無需匹配路由据忘,只匹配鹦牛?前面的內(nèi)容。
post傳參格式:127.0.0.1:80/login/
post請求傳參數(shù)若河,請求參數(shù)是放在請求體(body)里面的能岩。比如登錄的用戶名和密碼等重要的內(nèi)容都用POST傳參數(shù)。
使用到的工具postman萧福。
獲取GET請求參數(shù)的內(nèi)容:
@app.route('/params/')
def params():
# 獲取GET請求傳遞的參數(shù)
name = request.args['name'] # 獲取GET請求的參數(shù)沒有時(shí)會(huì)報(bào)錯(cuò)
name = request.args.get('name') # 獲取GET請求的參數(shù)拉鹃,使用get方法沒有值也不會(huì)報(bào)錯(cuò)
age = request.args.get('age')
return '獲取GET請求的參數(shù):name=%s age=%s。'%(name, age)
獲取POST請求參數(shù)的內(nèi)容:
# 默認(rèn)請求方式個(gè)GET鲫忍,設(shè)置了POST則無法接受GET請求
@app.route('/post_params/', methods=['POST'])
def post_params():
name = request.form['name']
name = request.form.get('name')
age = request.form.get('age')
favourites = request.form.getlist('favourite')
print(favourites)
return '獲取post參數(shù):name=%s age=%s favourite=%s'%(name, age, [favourite for favourite in favourites])
注意:getlist
是獲取POST請求有很多相同變量名的值膏燕,結(jié)果以列表返回。應(yīng)用場景悟民,在前端提交有checkbox的表單時(shí)坝辫,獲取checkbox復(fù)選框的值得時(shí)候。