【編程】Notebook中使用Flask

如何在Notebook中用Python開(kāi)發(fā)Web服務(wù)器?

Flask是什么?

Web服務(wù)框架,就是網(wǎng)站后臺(tái)程序的代碼模板,可以用它快速創(chuàng)建服務(wù)器程序。

安裝Flask

直接在Anaconda的Notebook內(nèi)執(zhí)行:

conda install flask

然后就會(huì)輸出很多信息,等待安裝完成即可。

編寫(xiě)最簡(jiǎn)服務(wù)器

實(shí)際上并不能直接在Notebook內(nèi)運(yùn)行Flask程序,但我們可以先創(chuàng)建一個(gè)py文件,然后再?gòu)腘otebook中運(yùn)行它。
%%writefile xx.py這種魔術(shù)寫(xiě)法可以從Notebook內(nèi)創(chuàng)建.py文件。
直接從Flask官網(wǎng)復(fù)制案例代碼,如下:

%%writefile run.py
from flask import Flask, escape, request

app = Flask(__name__)

@app.route('/')
def hello():
    name = request.args.get("name", "World")
    return f'Hello, {escape(name)}!'

上面這個(gè)代碼創(chuàng)建了一個(gè)run.py文件,就保存在Notebook文件一起。

運(yùn)行服務(wù)器

然后我們可以再?gòu)腘otebook中運(yùn)行它,最好的辦法是使用Python的subprocess子進(jìn)程管理工具,代碼如下。

import subprocess as sp
try:
    server.terminate()
except:
    pass
server = sp.Popen("FLASK_APP=run.py flask run --port=8032", shell=True)
server

這里的FLASK_APP=run.py flask run同樣來(lái)自Flask官網(wǎng)。注意應(yīng)該先終止之前的服務(wù)程序。正常的話可以在終端得到類似下圖的提示。

更多信息請(qǐng)參考Subprocess官方文檔

測(cè)試網(wǎng)頁(yè)

依照Flask官方說(shuō)法,服務(wù)器默認(rèn)運(yùn)行在5000端口,但被我們修改到了port=8082,所以在瀏覽器打開(kāi)http://127.0.0.1:8082/?name=zhyuzh,這里的127.0.0.1也可以換為localhost。正??梢缘玫较聢D:

這里的?name=zhyuzh對(duì)應(yīng)了上面的request.args.get("name", "World")的參數(shù),如果它的話World就是默認(rèn)名字。

文件服務(wù)

導(dǎo)入send_from_directory可以實(shí)現(xiàn)對(duì)文件的路由,就是把用戶發(fā)來(lái)的地址欄路徑對(duì)應(yīng)到一個(gè)網(wǎng)頁(yè)文件夾。代碼如下:

%%writefile run.py
from flask import Flask, escape, request, send_from_directory

app = Flask(__name__)

@app.route('/hello')
def hello():
    name = request.args.get("name", "World")
    return f'Hello, {escape(name)}!'

@app.route('/web/<path:path>')
def send_js(path):
    return send_from_directory('web', path)

if __name__ == "__main__":
    app.run()

這里面的/web/<path:path>對(duì)應(yīng)了下面的send_from_directory('web', path),也就是把http://127.0.0.1:8032/web/index.html對(duì)應(yīng)到了./web/index.html文件。

用下面的代碼生成index.html文件:

%%writefile ./web/index.html
<!DOCTYPE html>
<form action="/hello">
    <label for="name">name:</label><br>
    <input type="text" id="name" name="name" value="Tom"><br>
    <input type="submit" value="Submit">
</form> 

上面這個(gè)代碼是個(gè)包含一個(gè)name輸入框和一個(gè)提交按鈕的表單,點(diǎn)擊按鈕就會(huì)將name輸入框的數(shù)據(jù)發(fā)送到服務(wù)器/hello路由上。

再次運(yùn)行服務(wù):

import subprocess as sp
try:
    server.terminate()
except err:
    pass
server = sp.Popen("FLASK_APP=run.py flask run --port=8032", shell=True)
server

然后打開(kāi)http://127.0.0.1:8032/web/index.html就會(huì)看到網(wǎng)頁(yè)如下:

隨便輸入一個(gè)名稱,然后點(diǎn)擊提交,就會(huì)跳轉(zhuǎn)到/hello地址,自動(dòng)問(wèn)好:

附加

實(shí)際上現(xiàn)代的Web頁(yè)面都是前后端分離的,也并不會(huì)使用form表達(dá)這種提交方法,更不會(huì)一點(diǎn)擊按鈕就跳轉(zhuǎn)頁(yè)面。更多的web前后端分離思路請(qǐng)學(xué)習(xí)以下內(nèi)容:

  • JQuery的Ajax提交數(shù)據(jù)方式
  • Bootstrap的界面美化框架
  • Vue數(shù)據(jù)綁定界面自動(dòng)化更新

這里并沒(méi)有介紹連接數(shù)據(jù)庫(kù)和實(shí)現(xiàn)更復(fù)雜的路有效果,后續(xù)還會(huì)更新更多的技術(shù)文章,敬請(qǐng)關(guān)注。


歡迎關(guān)注我的專欄( つ??ω??)つ【人工智能通識(shí)】


每個(gè)人的智能新時(shí)代

如果您發(fā)現(xiàn)文章錯(cuò)誤,請(qǐng)不吝留言指正;
如果您覺(jué)得有用,請(qǐng)點(diǎn)喜歡;
如果您覺(jué)得很有用,歡迎轉(zhuǎn)載~


END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容