一蹦狂、Flask自動(dòng)重啟:
每次代碼修改后,必須保存后嗦明,重啟服務(wù)器笼沥,然后代碼才可以生效,這是python開(kāi)發(fā)服務(wù)器特點(diǎn)招狸,而想php開(kāi)發(fā)敬拓,就不需要每次重啟服務(wù)器
解決方案:
1.寫(xiě)腳本邻薯,自動(dòng)監(jiān)聽(tīng)文件的改動(dòng)裙戏,如果有改動(dòng),就自動(dòng)重啟服務(wù)(太麻煩)
2.flask內(nèi)置了一個(gè)功能厕诡,可以自動(dòng)重啟服務(wù)器累榜,只需要將flask的debug模式打開(kāi)。代碼如下:
app.run(debug=True)
二灵嫌、flask 路由的唯一url 特性:
@app.route('/hello/')
def hello():
return "hello"
當(dāng)訪問(wèn) “/hello” 后面不帶斜杠的地址壹罚,flask會(huì)將 “/hello” 重定向到 “/hello/” 目錄下(這里重定向是發(fā)了2個(gè)請(qǐng)求,第一個(gè)是“/hello”,第二個(gè)是“/hello/”)寿羞,這樣就兼容了用戶的錯(cuò)誤輸入
當(dāng)訪問(wèn)“/hello/” 帶后面斜杠的地址猖凛,就直接訪問(wèn)“/hello/” 目錄。
flask這樣設(shè)置重定向的意義:保證了url唯一性绪穆,不能因?yàn)楹竺鎺Щ虿粠备鼙嬗荆投x成2個(gè)地址,但實(shí)質(zhì)他們內(nèi)容是一致的玖院,這樣導(dǎo)致爬蟲(chóng)反復(fù)爬取重復(fù)內(nèi)容菠红,不利于SEO。
三难菌、flask 路由注冊(cè)的兩種方法:
方式一:
@app.route('/hello/')
def hello():
return "hello"
方式二:
def hello():
return "hello"
app.add_url_rule('/hello', view_func=hello)
兩種方式的區(qū)別试溯,其實(shí)方式一,@app.route 里面就是調(diào)用了app.add_url_rule()這個(gè)方法(通過(guò)command + 點(diǎn)擊郊酒,跳轉(zhuǎn)到方法定義的地方)遇绞,只是方式一封裝了一層裝飾器键袱,方便我們調(diào)用。
四摹闽、app.run 參數(shù)和flask其他配置文件
app.run(debug=True) //如果只有這一個(gè)參數(shù)杠纵,是只能被本機(jī)的localhost 訪問(wèn),連局域網(wǎng)里面的其他機(jī)器都是不能訪問(wèn)的
app.run(host='0.0.0.0', debug=True钩骇,port=81) //host 指定IP地址比藻。0.0.0.0接受外網(wǎng)的訪問(wèn) , 自定義端口
單獨(dú)弄一個(gè)config.py配置文件,方便后期線上版本管理倘屹。
//config.py 配置文件里面的參數(shù)常量银亲,都寫(xiě)成大寫(xiě)
DEBUG = True
//app.config.from_object(‘模塊路徑’),config.py就在當(dāng)前目錄下,所以直接寫(xiě)纽匙。
app.config.from_object('config')
app.run(host='0.0.0.0', debug=app.config['DEBUG']务蝠,port=81)
注意:app.config是一個(gè)字典,里面有一個(gè)默認(rèn)參數(shù)DEBUG = False,所以如果要覆蓋掉原來(lái)默認(rèn)DEBUG值烛缔,必須把配置文件的參數(shù)設(shè)置成DEBUG馏段,全部大寫(xiě)。
五践瓷、if __ name __作用
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=app.config['DEBUG']院喜,port=81)
這句話作用:
1.如果本文件不是flask入口文件,而且被其他文件作為模塊導(dǎo)入晕翠,那么后面的語(yǔ)句不會(huì)被執(zhí)行喷舀。
2.在開(kāi)發(fā)環(huán)境,會(huì)啟動(dòng)一個(gè)Flask簡(jiǎn)單的服務(wù)器淋肾,真實(shí)的生產(chǎn)線上環(huán)境是用nginx + uwsgi 硫麻。nginx接受瀏覽器傳過(guò)來(lái)請(qǐng)求,然后轉(zhuǎn)發(fā)給uwsgi這個(gè)web服務(wù)器樊卓。線上環(huán)境拿愧,F(xiàn)lask是通過(guò)uwsgi加載run.py這個(gè)模塊來(lái)啟動(dòng)的,而不是手動(dòng)的python run.py來(lái)啟動(dòng)的碌尔,在生產(chǎn)環(huán)境浇辜,run.py就不再是flask入口文件,而是被加載進(jìn)來(lái)的七扰,所以如果不寫(xiě)第一行if的判讀的話奢赂,在生產(chǎn)環(huán)境 app.run( 。 颈走。 膳灶。)這句代碼根本不會(huì)被執(zhí)行的。如果沒(méi)有if判斷,那么app.run就會(huì)啟動(dòng)轧钓,就意味著這個(gè)啟動(dòng)了Flask自帶的服務(wù)器序厉。啟動(dòng)了2個(gè)服務(wù)器。
六毕箍、視圖函數(shù)和普通函數(shù)的區(qū)別
//視圖函數(shù)hello
@app.route('/hello/')
def hello():
return '<html> </html>' //訪問(wèn)結(jié)果是空白
//普通函數(shù)world
def world():
return "world"
視圖函數(shù)返回信息除了簡(jiǎn)單文本外弛房,還有一些附加信息
status code 201 / 404 等等
content-type 默認(rèn)值text/html ,告訴客戶端如何解析我們返回的內(nèi)容而柑,這就解釋了上述訪問(wèn)/hello就是什么內(nèi)容看不到文捶,如果<html> test </html> ,那就顯示了test內(nèi)容
七媒咳、視圖函數(shù)返回的是什么
服務(wù)器返回給客戶端基本就是純文本粹排,或者h(yuǎn)tml,或者json 形式的api涩澡,但視圖函數(shù)返回內(nèi)容的就是字符串顽耳,只是設(shè)置了content-type導(dǎo)致返回結(jié)果不一樣
//text/plain 純文本
//application/json json數(shù)據(jù)
//text/html html數(shù)據(jù)
@app.route('/world2/')
def world2():
header = {
'content-type':'text/plain'
}
reponse = make_response('<html></html>',201)
reponse.headers = header
return reponse