- flask框架概述
- 虛擬環(huán)境的創(chuàng)建
- pycharm創(chuàng)建flask項(xiàng)目
- HelloWorld運(yùn)行
- (___name____)詳解
- 路由的使用
- 終端(Terminal)的使用
- 項(xiàng)目資源文件的配置
- 程序加載配置
- postman的使用
flask框架概述
Flask為Python屬下的web框架之一,具有比Django更大的靈活性,而由于建立時(shí)間較晚,因此相較于Django在實(shí)際應(yīng)用上略遜。但是Flask的強(qiáng)大在于其靈活性以及強(qiáng)可擴(kuò)展性,這是Django所望塵莫及的。作為一個(gè)微框架,F(xiàn)lask的體量也相對(duì)于Django小,其在大型網(wǎng)站的應(yīng)用暫時(shí)沒(méi)有實(shí)際示例,而小型app則有很多,因此學(xué)好flask框架有利于接下來(lái)學(xué)習(xí)數(shù)據(jù)挖掘、TensorFlow、PyTorch等工具后將其落地。
Flask誕生于2010年,是Armin ronacher(人名)用Python語(yǔ)言基于Werkzeug工具箱編寫的輕量級(jí)Web開發(fā)框架。它主要面向需求簡(jiǎn)單的小應(yīng)用。
Flask本身相當(dāng)于一個(gè)內(nèi)核,其他幾乎所有的功能都要用到擴(kuò)展(郵件擴(kuò)展Flask-Mail,用戶認(rèn)證Flask-Login),都需要用第三方的擴(kuò)展來(lái)實(shí)現(xiàn)。比如可以用Flask-extension加入ORM、窗體驗(yàn)證工具,文件上傳、身份驗(yàn)證等。Flask沒(méi)有默認(rèn)使用的數(shù)據(jù)庫(kù),你可以選擇MySQL,也可以用NoSQL。其 WSGI 工具箱采用 Werkzeug(路由模塊) ,模板引擎則使用 Jinja2 。
可以說(shuō)Flask框架的核心就是Werkzeug和Jinja2。
Python最出名的框架要數(shù)Django,此外還有Flask、Tornado等框架。雖然Flask不是最出名的框架,但是Flask應(yīng)該算是最靈活的框架之一,這也是Flask受到廣大開發(fā)者喜愛(ài)的原因。
Flask的Github地址:https://github.com/pallets/flask
Flask中文文檔地址:http://docs.jinkan.org/docs/flask/
創(chuàng)建虛擬環(huán)境
與Django一樣,flask也是可以在虛擬環(huán)境下進(jìn)行創(chuàng)建的(這樣的好處就是當(dāng)項(xiàng)目的python版本不同時(shí)可以同時(shí)使用)
因?yàn)樵谥暗膁jango中已經(jīng)在該python版本(3.7.7)安裝了虛擬環(huán)境以及管理包,也就是:
pip install virtualenv
pip install virtualenvwrapper-win
所以直接創(chuàng)建虛擬環(huán)境即可:
mkvirtualenv -p python3 py_flask
或
mkvirtualenv flask_vir1 #在python下創(chuàng)建虛擬環(huán)境
workon flask_vir1 #進(jìn)入虛擬環(huán)境
pip install flask 安裝flask
deactivate (虛擬環(huán)境名) #退出當(dāng)前的虛擬環(huán)境
在cmd:

pycharm創(chuàng)建項(xiàng)目
在pycharm專業(yè)版中可以直接創(chuàng)建flask項(xiàng)目,并且省略大部分的配置。
但是當(dāng)使用pycharm社區(qū)版時(shí),只能創(chuàng)建pure python項(xiàng)目。
在這里使用pycharm創(chuàng)建pure python項(xiàng)目搭建flask項(xiàng)目:
打開pycharm,創(chuàng)建pure python項(xiàng)目,選擇已有的虛擬環(huán)境(剛在創(chuàng)建的虛擬環(huán)境):

點(diǎn)擊create
HelloWorld
創(chuàng)建成功后,就是一個(gè)空項(xiàng)目,什么都沒(méi)有。
如果使用pycharm專業(yè)版創(chuàng)建flask項(xiàng)目,那么會(huì)有好幾個(gè)文件以及文件夾。
在項(xiàng)目下創(chuàng)建python文件---HelloWorld.py
要使用flask,就首先要導(dǎo)入flask框架中的Flask模塊。
HelloWorld.py:
from flask import Flask
#Flask接受一個(gè)參數(shù)__name__,他會(huì)指向程序所在的包
app = Flask(__name__)
#路由和函數(shù)
@app.route('/')
def index():
return '頭像真帥'
#main函數(shù)
if __name__ == '__main__':
app.run()
到這里就可以運(yùn)行了:

(___name____)詳解
main函數(shù):
if __name__ == '__main__':
類似c或者Java中的mian函數(shù),--程序的入口文件
test1.py:
def test_func():
print(__name__)
def test1_func(name):
print(type(name), name)
test_func() #__main__
test1_func(__name__) #<class 'str'> __main__
#在當(dāng)前模塊下運(yùn)行,在test_func函數(shù)中打印__name__,這個(gè)__name__就是當(dāng)前文件的__name__,所以打印__main__
#在test1_func函數(shù)中,傳入?yún)?shù)__name__,也是但當(dāng)前文件的__name__,所以還是打印__main__
name.py:
# __name__是類屬性,也就是靜態(tài)屬性
from test1 import test1_func,test_func
'''
在當(dāng)前模塊運(yùn)行時(shí),__name__ 為__main__
使用import導(dǎo)入時(shí), __name__ 為 所在的模塊的文件名(去掉.py)
'''
test_func() #test1
test1_func(__name__) #<class 'str'> __main__
#import方式使用,test_func()打印的__name__,是test1文件下的__name__,所以打印test1。
#test1_func()中,參數(shù)傳遞的是當(dāng)前模塊的__name__,所以打印__main__。
到這里就知道了flask中
app = Flask(__name__)
和
if __name__ == '__main__':
app.run()
#給Flask傳遞的參數(shù)__name__是當(dāng)前模塊的__name__,
#那么__name__就是__main__,那么程序自然就運(yùn)行到app.run()了。
路由的使用
在flask中也有類似于django的url路由,但是比django的簡(jiǎn)單很多,直接在相應(yīng)的視圖函數(shù)上加上一個(gè)裝飾器即可:
#裝飾器的作用就是講路由映射到相應(yīng)的視圖函數(shù)上
@app.route('/')
def index():
return '頭像真帥'
終端(Terminal)的使用
在flask中要進(jìn)入python shell:
flask shell
但是前提是項(xiàng)目中必須有有app.py文件,并且要在app.py中寫最基本的組成部分。

項(xiàng)目資源文件的配置
在Flask類中有許多的初始化參數(shù):
'''
static_url_path:靜態(tài)訪問(wèn)路徑(可不傳,默認(rèn)為static)
static_folder:靜態(tài)文件夾(可不傳,默認(rèn)為static)
template_folder:模板訪問(wèn)路徑(可不傳,默認(rèn)為templates)
'''
static_url_path的設(shè)置:
- 如果static_folder未被指定(也就是默認(rèn)值static),那么static_url_path取為static
- 如果static_folder被指定了,那么static_url_path等于static_folder的最后一級(jí)文件夾名稱。
- 手動(dòng)指定static_url_path時(shí),如果static_url_path不為空串,url的路徑必須以/開頭,如/static。
- 手動(dòng)指定static_url_path時(shí),如果static_url_path為空串,url路徑不必以/開頭,否則相當(dāng)于static_url_path=None的情況,也就是使用static_folder的目錄名字。
- static_url_path是前端訪問(wèn)資源文件的前綴目錄。默認(rèn)是/static,就是前端必須這樣訪問(wèn):<img src="/static/img/mylogo.jpg" />
我們改成 ''",就可以這樣訪問(wèn)了:<img src="/img/mylogo.jpg" />。就達(dá)到前端從根目錄訪問(wèn)的目的了。 - static_folder:
static_folder表示靜態(tài)文件所在路徑,默認(rèn)為總項(xiàng)目下的static文件夾
后端存儲(chǔ)資源文件的目錄。默認(rèn)是/static,就是指明你后端的資源文件,是放在<your project>/static/目錄下,一般不需要改動(dòng)。
也就是說(shuō)flask框架默認(rèn)總項(xiàng)目下的static文件靜態(tài)文件目錄(static_folder),templates為 模板目錄(template_folder)。以及前端訪問(wèn)靜態(tài)資源時(shí)的url根路徑(static_url_path)。
實(shí)例:
在項(xiàng)目中新建文件夾--static文件夾,在文件夾中新建index.html,然后運(yùn)行項(xiàng)目:
在url中訪問(wèn):
127.0.0.1:5000/static/index.html

這就是因?yàn)閟tatic_url_path默認(rèn)為static,所以可以訪問(wèn)到。
程序加載配置
在使用web框架時(shí)通常要配置很多的配置項(xiàng),在flask中常用的有兩種方式進(jìn)行加載配置
1.從配置對(duì)象中加載(常用)
也就是通過(guò)對(duì)象進(jìn)行配置,那么一定要?jiǎng)?chuàng)建類
在app.py中,創(chuàng)建了app實(shí)例后,進(jìn)行編寫配置類:
from flask import Flask
#Flask接受一個(gè)參數(shù)__name__,他會(huì)指向程序所在的包
app = Flask(__name__,static_folder='statics')
#1. 配置對(duì)象,里邊定義需要給APP添加的一系列配置
class Config(object):
DEBUG = True #在修改代碼之后直接保存,會(huì)自動(dòng)重啟服務(wù)器
# 程序加載配置
#1.從配置對(duì)象中加載,把類名傳給參數(shù)
app.config.from_object(Config)
#裝飾器的作用就是講路由映射到相應(yīng)的視圖函數(shù)上
@app.route('/')
def index():
return '頭像真帥'
#main函數(shù)
if __name__ == '__main__':
app.run()
添加的DEBUG=True,在修改代碼之后直接保存,會(huì)自動(dòng)重啟服務(wù)器,不需要像django重啟服務(wù)器,還可以設(shè)置數(shù)據(jù)庫(kù)等配置。
運(yùn)行:

修改index函數(shù)的返回值:

直接運(yùn)行:

2.配置文件中加載
顧名思義:就是創(chuàng)建一個(gè)文件,用于寫一些配置項(xiàng)。
使用:
在項(xiàng)目下新建文件config.ini,在該文件中寫:
#在此文件添加一些配置,一行一個(gè)
DEBUG = True
然后在app.py中使用:
#2.配置文件中加載,把文件名傳進(jìn)去
app.config.from_pyfile('config.ini')
再次運(yùn)行上一步中的結(jié)果,也是可以的。
3.從環(huán)境變量中加載(不常用)
app.run(參數(shù))
app.run(port=8000,debug=True) #port:指定端口號(hào),debug :自動(dòng)保存,并重啟服務(wù)
- port:指定端口號(hào)
-
debug :自動(dòng)保存,并重啟服務(wù)
運(yùn)行:
postman
Postman是chrome的一款插件,也可以下載app使用,用于做接口請(qǐng)求測(cè)試,無(wú)論是前端,后臺(tái)還是測(cè)試人員,都可以用postman來(lái)測(cè)試接口,用起來(lái)非常方便。
就是模擬像后端服務(wù)器url發(fā)送請(qǐng)求,測(cè)試請(qǐng)求是否正常的。

模擬項(xiàng)向
[http://127.0.0.1:5001/](http://127.0.0.1:5001/)
發(fā)送請(qǐng)求:

上邊的是請(qǐng)求方?jīng)]有進(jìn)行傳參,當(dāng)進(jìn)行web開發(fā)時(shí),要對(duì)后端不斷地傳遞參數(shù)也就是位置參數(shù)。
有參方式
在app.py中編寫服務(wù)器代碼:
@app.route('/user/<user_id>')
def user_info(user_id):
return f'hello{user_id}'
使用postman進(jìn)行測(cè)試:

