Flask Day1

Author: 陳倫巨

Data: 2019-04-05

Email: 545560793@qq.com

github: https://github.com/smartisantt

一椒拗、安裝環(huán)境

1、使用virtualenv安裝
  1. 在D盤創(chuàng)建兩個(gè)文件夾英文名,代碼(workspace)和環(huán)境(env)兩個(gè)文件夾
  2. 進(jìn)入env 文件夾 D: 再輸入cd env
  3. pip install virtualenv
  4. 創(chuàng)建一個(gè)叫flaskenv的虛擬環(huán)境名字 virtualenv --no-site-packages flaskenv
  5. 進(jìn)入文件cd Scripts
  6. windows下輸入 activate激活, Linux系統(tǒng)輸入source activate
  7. pip list 或者pip freeze可以查看當(dāng)前安裝環(huán)境
  8. 安裝pip install flask枉昏,也可以批量安裝第三方庫庆亡,新建一個(gè)txt文件里面每行寫安裝的第三方庫和對應(yīng)的版本今瀑,在終端進(jìn)入環(huán)境欢唾,輸入python install -r 文件名
  9. 退出環(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í)候。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末射亏,一起剝皮案震驚了整個(gè)濱河市近忙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌智润,老刑警劉巖及舍,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窟绷,居然都是意外死亡锯玛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門兼蜈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攘残,“玉大人,你說我怎么就攤上這事为狸〖吖” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵钥平,是天一觀的道長实撒。 經(jīng)常有香客問我,道長涉瘾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任捷兰,我火速辦了婚禮立叛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贡茅。我一直安慰自己秘蛇,他們只是感情好其做,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赁还,像睡著了一般妖泄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艘策,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天蹈胡,我揣著相機(jī)與錄音,去河邊找鬼朋蔫。 笑死罚渐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的驯妄。 我是一名探鬼主播荷并,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼青扔!你這毒婦竟也來了源织?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤微猖,失蹤者是張志新(化名)和其女友劉穎谈息,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體励两,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黎茎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了当悔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傅瞻。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盲憎,靈堂內(nèi)的尸體忽然破棺而出嗅骄,到底是詐尸還是另有隱情,我是刑警寧澤饼疙,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布溺森,位于F島的核電站,受9級(jí)特大地震影響窑眯,放射性物質(zhì)發(fā)生泄漏屏积。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一磅甩、第九天 我趴在偏房一處隱蔽的房頂上張望炊林。 院中可真熱鬧,春花似錦卷要、人聲如沸渣聚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奕枝。三九已至棺榔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隘道,已是汗流浹背喧半。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工鞠抑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓腔丧,卻偏偏與公主長得像闻坚,于是被迫代替她去往敵國和親货岭。 傳聞我的和親對象是個(gè)殘疾皇子鲜漩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    小邁克閱讀 2,963評論 1 3
  • python 也是很值得學(xué)習(xí)的一門工具。學(xué)好python和R缩幸。 1環(huán)境管理 管理 Python 版本和環(huán)境的工具 ...
    Liam_ml閱讀 4,812評論 1 51
  • parcel-vue一個(gè)基于parcel打包工具的 vue開發(fā)腳手架解決方案,強(qiáng)烈建議使用node8.0以上 項(xiàng)目...
    殘夢_6560閱讀 485評論 0 1