1.1 虛擬環(huán)境
1.1.1 為什么需要虛擬環(huán)境
學(xué)習(xí)Flask
之前抵碟,我們所有的第三方包安裝都是直接通過pip install xx
的方式進行安裝的解总,這樣安裝會將那個包安裝到你的系統(tǒng)級的Python
環(huán)境中秩仆。但是這樣有一個問題,就是如果你現(xiàn)在用Flask 1.1.x
寫了個網(wǎng)站,然后你的領(lǐng)導(dǎo)跟你說,之前有一個舊項目是用Flask 1.0.x
開發(fā)的叙甸,讓你來維護,但是Flask 1.1
不再兼容Flask 1.0
的一些語法了位衩。這時候就會碰到一個問題裆蒸,我如何在我的電腦中同時擁有Flask 1.1
和Flask 1.0
兩套環(huán)境呢?這時候我們就可以通過虛擬環(huán)境來解決這個問題糖驴。
1.1.2 虛擬環(huán)境原理介紹
虛擬環(huán)境相當(dāng)于一個抽屜光戈,在這個抽屜中安裝的任何軟件包都不會影響到其他抽屜哪痰。并且在項目中遂赠,我可以指定這個項目的虛擬環(huán)境來配合我的項目久妆。比如我們現(xiàn)在有一個項目是基于Flask 1.1.x
版本,又有一個項目是基于Flask 1.0.x
的版本跷睦,那么這時候就可以創(chuàng)建兩個虛擬環(huán)境筷弦,在這兩個虛擬環(huán)境中分別安裝Flask 1.1.x
和Flask 1.0.x
來適配我們的項目。
1.1.3 安裝virtualenv
virtualenv
是用來創(chuàng)建虛擬環(huán)境的軟件工具抑诸,我們可以通過pip
或者pip3
來安裝:
pip install virtualenv
pip3 install virtualenv
1. 創(chuàng)建虛擬環(huán)境
創(chuàng)建虛擬環(huán)境非常簡單烂琴,通過以下命令就可以創(chuàng)建了:
virtualenv [虛擬環(huán)境的名字]
如果你當(dāng)前的Python3/Scripts
的查找路徑在Python2/Scripts
的前面,那么將會使用python3
作為這個虛擬環(huán)境的解釋器蜕乡。如果python2/Scripts
在python3/Scripts
前面奸绷,那么將會使用Python2
來作為這個虛擬環(huán)境的解釋器。
2. 進入環(huán)境
虛擬環(huán)境創(chuàng)建好了以后层玲,那么可以進入到這個虛擬環(huán)境中号醉,然后安裝一些第三方包,進入虛擬環(huán)境在不同的操作系統(tǒng)中有不同的方式辛块,一般分為兩種畔派,第一種是Windows
,第二種是*nix
:
windows
進入虛擬環(huán)境:進入到虛擬環(huán)境的Scripts
文件夾中润绵,然后執(zhí)行activate
线椰。*nix
進入虛擬環(huán)境:source /path/to/virtualenv/bin/activate
一旦你進入到了這個虛擬環(huán)境中,你安裝包尘盼,卸載包都是在這個虛擬環(huán)境中憨愉,不會影響到外面的環(huán)境。
3. 退出虛擬環(huán)境
退出虛擬環(huán)境很簡單卿捎,通過一個命令就可以完成:deactivate
配紫。
4. 創(chuàng)建虛擬環(huán)境的時候指定Python解釋器
在電腦的環(huán)境變量中,一般是不會去更改一些環(huán)境變量的順序的娇澎。也就是說比如你的Python2/Scripts
在Python3/Scripts
的前面笨蚁,那么你不會經(jīng)常去更改他們的位置。但是這時候我確實是想在創(chuàng)建虛擬環(huán)境的時候用Python3
這個版本趟庄,這時候可以通過-p
參數(shù)來指定具體的Python
解釋器:
virtualenv -p C:\Python36\python.exe [virutalenv name]
1.1.4 virtualenvwrapper
virtualenvwrapper
這個軟件包可以讓我們管理虛擬環(huán)境變得更加簡單括细。不用再跑到某個目錄下通過virtualenv
來創(chuàng)建虛擬環(huán)境,并且激活的時候也要跑到具體的目錄下去激活戚啥。
1. 安裝 virtualenvwrapper
*nix
下安裝:pip install virtualenvwrapper
Windows
下安裝:pip install virtualenvwrapper-win
2. virtualenvwrapper基本使用
- 創(chuàng)建虛擬環(huán)境:
mkvirtualenv my_env
那么會在你當(dāng)前用戶下創(chuàng)建一個Env
的文件夾奋单,然后將這個虛擬環(huán)境安裝到這個目錄下。 如果你電腦中安裝了python2
和python3
猫十,并且兩個版本中都安裝了virtualenvwrapper
览濒,那么將會使用環(huán)境變量中第一個出現(xiàn)的Python
版本來作為這個虛擬環(huán)境的Python
解釋器呆盖。
- 切換到某個虛擬環(huán)境:
workon my_env
- 退出當(dāng)前虛擬環(huán)境:
deactivate
- 刪除某個虛擬環(huán)境:
rmvirtualenv my_env
- 列出所有虛擬環(huán)境:
lsvirtualenv
- 進入到虛擬環(huán)境所在的目錄:
cdvirtualenv
3. 修改mkvirtualenv的默認路徑
在我的電腦->右鍵->屬性->高級系統(tǒng)設(shè)置->環(huán)境變量->系統(tǒng)變量
中添加一個參數(shù)WORKON_HOME
,將這個參數(shù)的值設(shè)置為你需要的路徑贷笛。
4. 創(chuàng)建虛擬環(huán)境的時候指定Python版本
在使用mkvirtualenv
的時候应又,可以指定--python
的參數(shù)來指定具體的python
路徑:
mkvirtualenv --python==C:\Python36\python.exe my_env
1.2 認識web
1.2.1 url詳解
URL
是Uniform Resource Locator
的簡寫,統(tǒng)一資源定位符乏苦。
一個URL
由以下幾部分組成:
scheme://host:port/path/?query-string=xxx#anchor
scheme:代表的是訪問的協(xié)議株扛,一般為
http
或者https
以及ftp
等。host:主機名汇荐,域名洞就,比如
www.baidu.com
。port:端口號掀淘。當(dāng)你訪問一個網(wǎng)站的時候旬蟋,瀏覽器默認使用80端口。
path:查找路徑革娄。比如:
www.reibang.com/trending/now
倾贰,后面的trending/now
就是path
。query-string:查詢字符串稠腊,比如:
www.baidu.com/s?wd=python
躁染,后面的wd=python
就是查詢字符串。anchor:錨點架忌,后臺一般不用管吞彤,前端用來做頁面定位的。
注意:URL
中的所有字符都是ASCII
字符集叹放,如果出現(xiàn)非ASCII
字符饰恕,比如中文,瀏覽器會進行編碼再進行傳輸井仰。
1.2.2 web服務(wù)器和應(yīng)用服務(wù)器以及web應(yīng)用框架
web服務(wù)器:負責(zé)處理
http
請求埋嵌,響應(yīng)靜態(tài)文件,常見的有Apache
俱恶,Nginx
以及微軟的IIS
.應(yīng)用服務(wù)器:負責(zé)處理邏輯的服務(wù)器雹嗦。比如
php
、python
的代碼合是,是不能直接通過nginx
這種web服務(wù)器來處理的了罪,只能通過應(yīng)用服務(wù)器來處理,常見的應(yīng)用服務(wù)器有uwsgi
聪全、tomcat
等泊藕。web應(yīng)用框架:一般使用某種語言,封裝了常用的
web
功能的框架就是web應(yīng)用框架难礼,flask
娃圆、Django
以及Java中的SSH(Structs2+Spring3+Hibernate3)
框架都是web應(yīng)用框架玫锋。
1.2.3 Content-type和Mime-type的作用和區(qū)別
兩者都是指定服務(wù)器和客戶端之間傳輸數(shù)據(jù)的類型,區(qū)別如下:
- Content-type:既可以指定傳輸數(shù)據(jù)的類型讼呢,也可以指定數(shù)據(jù)的編碼類型撩鹿,例如:
text/html;charset=utf-8
- Mime-type:不能指定傳輸?shù)臄?shù)據(jù)編碼類型。例如:
text/html
常用的數(shù)據(jù)類型如下:
text/html
(默認的吝岭,html文件)text/plain
(純文本)text/css
(css文件)text/javascript
(js文件)application/x-www-form-urlencoded
(普通的表單提交)multipart/form-data
(文件提交)application/json
(json傳輸)application/xml
(xml文件)
1.3 Flask簡介
Flask
是一款非常流行的Python Web
框架三痰,出生于2010年,作者是Armin Ronacher
,本來這個項目只是作者在愚人節(jié)的一個玩笑窜管,后來由于非常受歡迎,進而成為一個正式的項目稚机。目前為止最新的版本是1.1.2
幕帆。
Flask
自2010年發(fā)布第一個版本以來,大受歡迎赖条,深得開發(fā)者的喜愛失乾,并且在多個公司已經(jīng)得到了應(yīng)用,Flask
能如此流行的原因纬乍,可以分為以下幾點:
微框架碱茁、簡潔、只做他需要做的仿贬,給開發(fā)者提供了很大的擴展性纽竣。
Flask
和相關(guān)的依賴(Jinja2
、Werkzeug
)設(shè)計得非常優(yōu)秀茧泪,用起來很爽蜓氨。開發(fā)效率非常高,比如使用
SQLAlchemy
的ORM
操作數(shù)據(jù)庫可以節(jié)省開發(fā)者大量書寫sql
的時間队伟。社會活躍度非常高穴吹。
Flask
的靈活度非常之高,他不會幫你做太多的決策嗜侮,即使做已經(jīng)幫你做出選擇港令,你也能非常容易的更換成你需要的,比如:
使用
Flask
開發(fā)數(shù)據(jù)庫的時候锈颗,具體是使用SQLAlchemy
還是MongoEngine
或者是不用ORM
而直接基于MySQL-Python
這樣的底層驅(qū)動進行開發(fā)都是可以的顷霹,選擇權(quán)完全掌握在你自己的手中。區(qū)別于Django
宜猜,Django
內(nèi)置了非常完善和豐富的功能泼返,并且如果你想替換成你自己想要的,要么不支持姨拥,要么非常麻煩绅喉。把默認的
Jinija2
模板引擎替換成Mako
引擎或者是其他模板引擎都是非常容易的渠鸽。
1.3.1 flask文檔
中文文檔: https://dormousehole.readthedocs.io/en/latest/
英文文檔: https://flask.palletsprojects.com/en/1.1.x/
1.3.2 安裝Flask
我們可以通過pip
或者pip3
來安裝Flask
:
# Python2或者Python3安裝方式
pip install flask
# Python3安裝方式
pip3 install flask
執(zhí)行上面命令后,除了安裝Flask
包外柴罐,同時被安裝的還有5個依賴包徽缚,它們的介紹如圖所示:
1.4 第一個Flask程序
用Pycharm新建一個Flask項目,新建項目的截圖如下:
點擊后創(chuàng)建一個新項目革屠,然后在文件中書寫代碼:
#coding: utf8
?
# 從flask這個包中導(dǎo)入Flask這個類
# Flask這個類是項目的核心凿试,以后很多操作都是基于這個類的對象
# 注冊url、注冊藍圖等都是基于這個類的對象
from flask import Flask
?
# 創(chuàng)建一個Flask對象似芝,傳遞__name__參數(shù)進去
# __name__參數(shù)的作用:
# 1. 可以規(guī)定模版和靜態(tài)文件的查找路徑
# 2. 以后一些Flask插件那婉,比如Flask-migrate、Flask-SQLAlchemy如果報錯了党瓮,那么Flask
# 可以通過這個參數(shù)找到具體的錯誤位置
app = Flask(__name__)
?
# app.route裝飾器映射URL和執(zhí)行的函數(shù)详炬。這個設(shè)置將根URL映射到了hello_world函數(shù)上
# @app.route:是一個裝飾器
# @app.route('/')就是將url中的/映射到hello_world這個視圖函數(shù)上面
# 以后你訪問我這個網(wǎng)站的/目錄的時候,會執(zhí)行hello_world這個函數(shù)寞奸,然后將這個函數(shù)的返回值
# 返回給瀏覽器呛谜。
# wwww.baidu.com/ -> hello_world函數(shù)
@app.route('/')
def hello_world():
return 'Hello World!'
? # 如果這個文件是作為一個主文件運行,那么就執(zhí)行app.run()方法
# 也就是啟動這個網(wǎng)站
if __name__ == '__main__':
# app.run()
# 運行本項目枪萄,host=0.0.0.0可以讓其他電腦也能訪問到該網(wǎng)站隐岛,port指定訪問的端口。默認的host是127.0.0.1瓷翻,port為5000
app.run(host='0.0.0.0',port=9000)
然后點擊運行聚凹,在瀏覽器中輸入 http://127.0.0.1:9000
就能看到hello world
了。需要說明一點的是逻悠,app.run
這種方式只適合于開發(fā)元践,如果在生產(chǎn)環(huán)境中,應(yīng)該使用Gunicorn
或者uWSGI
來啟動童谒。如果是在終端運行的单旁,可以按ctrl+c
來讓服務(wù)停止。
1.4.1 用Flask內(nèi)置命令行的方式啟動Flask
上面例子是通過Pycharm
點擊運行來啟動Flask或者使用cmd
來啟動Flask
(cmd
進入項目目錄然后輸入python app.py
)饥伊,其實Flask通過依賴包Click
內(nèi)置了一個CLI
象浑,我們可以執(zhí)行Flask
內(nèi)置的命令來啟動Flask
:
flask run
命令還可以指定主機和端口,只需要在后面加上--host=0.0.0.0 --port=8000
琅豆,這兩個配置可以指定其中任意一個也可以兩個同時指定:app.py
愉豺,所以flask run
命令會自動尋找程序?qū)嵗绻覀兊闹鞒绦蚰K是其他名稱茫因,比如hello.py
蚪拦,那么需要設(shè)置環(huán)境變量FLASK_APP
,否則運行flask run
將找不到主模塊,不能啟動Flask
服務(wù)驰贷。
# Linux或macOS系統(tǒng)設(shè)置FLASK_APP
$ export FLASK_APP=hello
# Windows系統(tǒng)設(shè)置FLASK_APP
> set FLASK_APP=hello
1.4.2 Flask依賴包Click內(nèi)置的其他命令
Flask除了內(nèi)置flask run
和set FLASK_APP
命令外還有一些其他命令:
-
set FLASK_ENV
:設(shè)置運行環(huán)境有兩個取值development
(開發(fā)環(huán)境)和production
(生產(chǎn)環(huán)境)盛嘿,默認是生產(chǎn)環(huán)境,設(shè)置為開發(fā)環(huán)境會自動開啟debug調(diào)試
-
flask shell
:類似于Python shell
括袒,會打開shell
命令模式次兆,自動包含flask程序上下文
,以及已經(jīng)導(dǎo)入的app實例
-
flask --help
:查看Flask
可用的命令及其說明文檔
設(shè)置開發(fā)環(huán)境flask shell命令
1.4.3 自定義Flask命令
除了Flask
內(nèi)置的命令锹锰,我們還可以自定義命令芥炭,自定義命令分以下幾步:
- 建立任意一個函數(shù)
- 為所建函數(shù)添加
app.cli.command()
裝飾器,裝飾器里可以添加參數(shù)恃慧,這個參數(shù)會作為運行時的命令名稱园蝠,不添加參數(shù),默認使用自定義的函數(shù)名稱為命令名稱 - 然后在CLI下運行
flask 自定義函數(shù)名
例如我們自定義一個hello()
命令函數(shù)糕伐,我們運行自定義命令時會在CLI
中輸出hello world砰琢!
import click
# 可以在裝飾器里添加參數(shù),這個參數(shù)會作為運行時的命令名稱
# 如@app.cli.command('say-hello')良瞧,運行時輸入 flask say-hello
@app.cli.command()
def hello():
# click模塊的echo()函數(shù)可以在命令界面輸出字符
click.echo('hello world!')
1.5 app初始化參數(shù)
app = Flask()
的可選參數(shù):
import_name
: 導(dǎo)入路徑(尋找靜態(tài)目錄與模板目錄位置的參數(shù)),一般寫__name__
训唱。
static_url_path
:訪問靜態(tài)資源的前綴褥蚯,默認static
,這個前綴目錄下都是靜態(tài)資源况增。
static_folder
: 靜態(tài)目錄的名字赞庶,默認static
,其實就是項目中項目目錄存放靜態(tài)資源文件夾的名字澳骤。
template_folder
: 模板目錄的名字歧强,默認templates
, 其實就是項目中項目目錄存放模板文件文件夾的名字为肮。
from flask import Flask
app = Flask(__name__,static_url_path='data'摊册,static_folder="front",template_folder="html_source" )
"""
這樣定義后,我們在瀏覽器訪問靜態(tài)資源就不能使用默認的前綴static(http://127.0.0.1:5000/static/01.jpg)颊艳,
需要加上data前綴茅特,http://127.0.0.1:5000/data/01.jpg,而且我們項目目錄中存放靜態(tài)資源的文件夾的名字
就不能是默認的static而要用定義了的front棋枕,最后我們項目目錄中存放模板的文件夾的名字就不能是默認templates白修,
而要使用定義的html_source
"""
1.6 配置參數(shù)
有5種方式來設(shè)置Flask
的配置參數(shù),使用app.config.from_pyfile
和app.config.from_object
重斑,app.config.upgrade()
兵睛,app.config[key]=value
,app.config.from_envvar
是從虛擬環(huán)境中讀取配置參數(shù)(一般不用):
- 使用配置文件,項目里新建一個文件(文件可以是
.py文件
或者.txt文件
等)祖很,把相關(guān)的配置寫到該文件中然后通過app
對象的config
屬性的from_pyfile
方式來導(dǎo)入配置文件笛丙。如在項目目錄中定義配置文件為"config.cfg"
,在程序中引入配置文件方式:app.config.from_pyfile("config.cfg")
突琳,路徑可以是相對路徑或者絕對路徑若债,這種方式,可以傳遞silent=True
拆融,那么這個靜態(tài)文件沒有找到的時候蠢琳,不會拋出異常漾月,我們在文件中定義的配置參數(shù)也不會生效占业。
app.config.from_pyfile('config.cfg',silent=True)
# silent=True表示如果配置文件不存在的時候不拋出異常,默認是為False惦费,會拋出異常趟脂。
- 從對象中導(dǎo)入泰讽,一般是定義一個配置參數(shù)的類(類名可以自定義,一般類名是
Config
)昔期,再把相關(guān)的參數(shù)配置以類屬性的方式定義已卸,然后通過app
對象的config
屬性的from_ object
方式來導(dǎo)入。如定義一個Config
類:
class Config(object):
DEBUG = True
# 導(dǎo)入方式
app.config.from_object(Config)
導(dǎo)入方式:app.config.from_object(Config)
,可以不用實例化一個Config
對象硼一,因為類也是對象累澡,flask
會自動從Config
類中讀取參數(shù)
也可以在項目目錄里定義一個.py文件
,然后在主app文件中導(dǎo)入般贼,再使用app.config.from_object()
的方式來配置愧哟,這種方式和使用app.config.from_pyfile()
不同在于需要導(dǎo)入.py文件
,而且app.config.from_pyfile()
方式不要導(dǎo)入但是需要指定配置文件位置及其文件后綴
# 導(dǎo)入項目目錄里定義的config.py文件
import config
# 配置config
app.config.from_object(config)
- 可以通過
app.config[key]=value
哼蛆,類似于字典的方式直接把相關(guān)的配置參數(shù)加上蕊梧。如:
app = Flask(__name__)
app.config['DEBUG'] = True
- 通過
app.config.upgrade()
,因為app.config
是字典的一個子類腮介,所以它可以類似字典的方式添加配置參數(shù)肥矢,可以用字典的upgrade()
方法,其實第3和第4種方法本質(zhì)上是一樣的萤厅,不過upgrade()
方法可以一次性添加多個配置參數(shù)
app = Flask(__name__)
app.config.upgrade(DEBUG = True)
- 通過環(huán)境變量的方式來配置參數(shù)橄抹,然后通過
app.config.from_envvar()
來讀取配置參數(shù)
# 在環(huán)境變量中設(shè)置MyAppConfig,并在其中設(shè)置配置參數(shù)
app.config.from_envvar('MyAppConfig')
1.6.1 在視圖讀取配置參數(shù)
如果我們需要指定一個配置參數(shù)它的值是什么惕味,我們有2種方法:
-
app.config.get()
按照字典取值的方法獲取配置參數(shù)的值或者是先導(dǎo)入current_app
再用current_app.config.get()
按照字典取值的方法獲取配置參數(shù)的值楼誓,如果沒有定義該配置參數(shù)將返回None
-
app.config[key]
按照字典取值的方式來獲取配置參數(shù),如果沒有定義該配置參數(shù)將返回None
1.6.2 app.run的參數(shù)
啟動app可以傳參數(shù)名挥,比如host
疟羹、port
,debug
,如果是配置參數(shù)榄融,配置參數(shù)只能傳debug
参淫,如果想在同一個局域網(wǎng)下的其他電腦訪問自己電腦上的Flask
網(wǎng)站,那么可以在app.run()
中設(shè)置host='0.0.0.0'
才能訪問得到
app.run(host="0.0.0.0", port=5000,debug=True)
1.7 開啟debug模式
1.7.1 為什么需要開啟DEBUG模式
- 如果開啟了
DEBUG
模式愧杯,那么在代碼中如果拋出了異常涎才,在瀏覽器的頁面中可以看到具體的錯誤信息,以及具體的錯誤代碼位置力九。方便開發(fā)者調(diào)試耍铜。 - 如果開啟了
DEBUG
模式,那么以后在Python
代碼中修改了任何代碼跌前,只要按ctrl+s
棕兼,flask
就會自動的重新記載整個網(wǎng)站。不需要手動點擊重新運行抵乓。
1.7.2 debug配置的7種方式
debug
配置的其中5種方式其實就是上面說的如何導(dǎo)入配置參數(shù)的那5種方式伴挚,還有兩種方式也講到了,就是在命令行使用set FLASK_ENV=development
灾炭,然后再使用flask run
會自動啟用debug模式
茎芋,不過這種配置僅限于flask run
啟動,還有一種配置方式就是app.run(debug=True)
在Pycharm中有些配置方式是沒有效果
1.7.3 PIN碼
開啟了debug
模式后蜈出,flask會自動生成一個PIN
碼败徊,PIN
碼用于頁面調(diào)試如果想要在網(wǎng)頁上調(diào)試代碼,那么應(yīng)該輸入PIN
碼掏缎。