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文件里面每行寫安裝的第三方庫和對(duì)應(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_scriptfrom 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ā)各種請(qǐng)求,發(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)試模式絕對(duì)不能用于生產(chǎn)環(huán)境!??!
在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ù)綁定到對(duì)應(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'
五、獲取請(qǐng)求參數(shù)
get和post傳參:
HTTP協(xié)議未規(guī)定GET和POST傳參長度的限制,但是瀏覽器和web服務(wù)器對(duì)其有限制,不同瀏覽器和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請(qǐng)求傳參數(shù),請(qǐng)求參數(shù)是放在請(qǐng)求體(body)里面的。比如登錄的用戶名和密碼等重要的內(nèi)容都用POST傳參數(shù)。
使用到的工具postman。
獲取GET請(qǐng)求參數(shù)的內(nèi)容:
@app.route('/params/')
def params():
# 獲取GET請(qǐng)求傳遞的參數(shù)
name = request.args['name'] # 獲取GET請(qǐng)求的參數(shù)沒有時(shí)會(huì)報(bào)錯(cuò)
name = request.args.get('name') # 獲取GET請(qǐng)求的參數(shù),使用get方法沒有值也不會(huì)報(bào)錯(cuò)
age = request.args.get('age')
return '獲取GET請(qǐng)求的參數(shù):name=%s age=%s。'%(name, age)
獲取POST請(qǐng)求參數(shù)的內(nèi)容:
# 默認(rèn)請(qǐng)求方式個(gè)GET,設(shè)置了POST則無法接受GET請(qǐng)求
@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請(qǐng)求有很多相同變量名的值,結(jié)果以列表返回。應(yīng)用場景,在前端提交有checkbox的表單時(shí),獲取checkbox復(fù)選框的值得時(shí)候。