国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

18143453325 在線咨詢 在線咨詢
18143453325 在線咨詢
所在位置: 首頁 > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > python上手--flask框架web開發(fā)實(shí)踐

python上手--flask框架web開發(fā)實(shí)踐

時(shí)間:2022-08-29 02:36:01 | 來源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2022-08-29 02:36:01 來源:網(wǎng)站運(yùn)營(yíng)

python在網(wǎng)絡(luò)方面的應(yīng)用非常廣泛,這里我們關(guān)注一下網(wǎng)站服務(wù)器及web開發(fā)部分。python幾行代碼就可以搭建一個(gè)web服務(wù)器,然后使用python語言來開發(fā)后臺(tái)服務(wù)。之前的文章我對(duì)web服務(wù)做了較為詳細(xì)的介紹,這個(gè)服務(wù)主要包括http的各種類型請(qǐng)求,如get、post等常規(guī)請(qǐng)求。對(duì)于web開發(fā),不同頁面之間的跳轉(zhuǎn)、數(shù)據(jù)傳輸通信、網(wǎng)頁存儲(chǔ)、緩存等是基礎(chǔ)知識(shí),如果采用原生python來寫估計(jì)難度還是很大的,所以感謝前人栽樹,有了一些成熟的框架模塊,我們?cè)賮硎褂脮r(shí)就非常方便。當(dāng)然至于python用于web服務(wù)的性能如何,這里我們不做討論。在web開發(fā)框架部分,較為知名的包括django、flask等框架。

Flask是一個(gè)用Python編寫的Web應(yīng)用程序框架。它由Armin Ronacher開發(fā),他領(lǐng)導(dǎo)一個(gè)名為Pocco的國(guó)際Python愛好者團(tuán)隊(duì)。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。兩者都是Pocco項(xiàng)目。對(duì)于Flask框架的應(yīng)用基礎(chǔ)和使用經(jīng)驗(yàn),網(wǎng)絡(luò)上有許多可以文章可以參考。我們以上手實(shí)踐為主,來使用flask搭建一個(gè)較為簡(jiǎn)單的web網(wǎng)站。

(1)flask安裝

flask是第一個(gè)第三方庫。與其他模塊一樣,安裝時(shí)可以直接使用python的pip命令實(shí)現(xiàn)。不過首先需要保證python要安裝好,鑒于目前python2已經(jīng)不受社區(qū)支持,直接下載python3來安裝即可。在python基礎(chǔ)開發(fā)環(huán)境準(zhǔn)備時(shí),還有一點(diǎn)需要注意的是,python自帶IDLE對(duì)于flask支持并不好,所以我們需要使用其他類型的IDE工具。如受歡迎的pycharm,科學(xué)計(jì)算的anaconda中的spyder以及vscode等。

下面我們都使用pycharm來進(jìn)行python實(shí)踐。Pycharm選擇免費(fèi)的社區(qū)版下載即可。在pycharm里安裝flask的方法如下:

在項(xiàng)目的setting設(shè)置菜單里選擇解釋器窗口,點(diǎn)擊右側(cè)的+號(hào)尋找可以安裝的第三方庫。選中Flask,點(diǎn)擊安裝即可。視網(wǎng)絡(luò)速度快慢,一般都比較快的可以完成安裝。

安裝完成后,可以新建一個(gè)python文件,在代碼里輸入from flask import Flask語句,直接運(yùn)行一下如果終端窗口不報(bào)錯(cuò),就說明該庫已經(jīng)存在了,可以直接使用。

(2)flask搭建服務(wù)器

flask是web開發(fā)框架,簡(jiǎn)單易學(xué),因此用flask來搭建web服務(wù)也非常簡(jiǎn)單。

在pycharm新建一個(gè)項(xiàng)目,命名為web2020,然后新建一個(gè)python文件,命名為main.py。在代碼中輸入如下代碼:

from flask import Flask #導(dǎo)入Flask類app=Flask(__name__) #實(shí)例化并命名為app實(shí)例if __name__=="__main__": app.run(port=2020,host="127.0.0.1",debug=True) #調(diào)用run方法,設(shè)定端口號(hào),啟動(dòng)服務(wù)執(zhí)行該文件,在終端就有如下提示:

此時(shí)打開瀏覽器,在瀏覽器地址輸入127.0.0.1:2020運(yùn)行,頁面會(huì)提示報(bào)錯(cuò),因?yàn)榇藭r(shí)還沒有任何內(nèi)容輸出,僅僅是web服務(wù)的搭建。

(3)flask開發(fā)簡(jiǎn)單網(wǎng)頁

如果在main.py文件中開始加入一些內(nèi)容,并使得能在網(wǎng)頁上顯示,就進(jìn)入了我們常見的web開發(fā)模式了。由于main.py為python文件,而不是我們常用的HTML,因此無法直接使用html語言來寫界面和內(nèi)容。

對(duì)于web開發(fā)和運(yùn)行而言,在瀏覽器地址欄那我們知道是url,也就是請(qǐng)求的網(wǎng)頁地址,如http://127.0.0.1/index或者h(yuǎn)ttp://127.0.0.1/home/user、或者h(yuǎn)ttp://127.0.0.1/index/news.html這些模式。在使用一些服務(wù)器語言來實(shí)現(xiàn)web開發(fā)時(shí),url構(gòu)建和定位使用了面向?qū)ο蠡蛘吆瘮?shù)方式。如http://127.0.0.1/home/user,可以分拆理解:http://127.0.0.1為服務(wù)器地址,默認(rèn)為請(qǐng)求index方法頁面。地址后面的/home/user可以理解為定位到服務(wù)器地址文件夾里home類里的user方法頁面。

在使用flask框架來開發(fā)時(shí),這種url的構(gòu)建和定位也是非常重要的。我們先來看一個(gè)簡(jiǎn)單案例:

from flask import Flaskapp=Flask(__name__)@app.route('/')def index(): return 'welcome to my webpage!'if __name__=="__main__": app.run(port=2020,host="127.0.0.1",debug=True)代碼中使用了裝飾器來制定路由url,具體寫法如下:

@app.route('/') #調(diào)用route路由方法,括號(hào)里給定參數(shù),/符號(hào)默認(rèn)為首頁@app.route('/home/user') #調(diào)用route路由方法,/home/user定位到訪問user方法頁面在定制了路由url后,還需要給定一個(gè)實(shí)現(xiàn)方法,使用python定義函數(shù)的方式來實(shí)現(xiàn),如上index函數(shù),返回一個(gè)字符串welcome to my webpage。也就是當(dāng)路由url定位到首頁時(shí),就調(diào)用這個(gè)index函數(shù),此時(shí)就會(huì)在瀏覽器上輸出這個(gè)字符串內(nèi)容。

如下執(zhí)行效果:

上述那個(gè)return語句里還可以加入html代碼,這樣就可以輸出一定的格式控制網(wǎng)頁內(nèi)容了,如修改如下:

@app.route('/')def index(): return '<h3>welcome to my webpage!</h3><hr><p style="color:red">輸出語句測(cè)試</p>'再重新運(yùn)行py文件,瀏覽器刷新一下就顯示為:

不過要在return里語句加入html長(zhǎng)串代碼,顯然不合適,所以需要使用flask庫里的Jinja2模板引擎,調(diào)用flask模塊里的render_template方法,將靜態(tài)的html文件傳入,同時(shí)也可以將數(shù)據(jù)傳輸?shù)絟tml文件中顯示。此時(shí)我們修改一下上述案例代碼:

from flask import Flask,render_template #導(dǎo)入render_template模塊app=Flask(__name__)@app.route('/')def index(): return render_template("index.html") #調(diào)用render_template函數(shù),傳入html文件參數(shù)if __name__=="__main__": app.run(port=2020,host="127.0.0.1",debug=True)如果這樣運(yùn)行,pycharm終端會(huì)提示報(bào)錯(cuò),因?yàn)檎也坏絠ndex.html文件。flask框架在使用這個(gè)模板函數(shù)時(shí),默認(rèn)去尋找項(xiàng)目文件夾下的templates文件夾里的html文件。因此我們需要先新建一個(gè)templates文件夾,然后在里面新建一個(gè)html文件,項(xiàng)目結(jié)構(gòu)及內(nèi)容參考如下:

這樣我們就準(zhǔn)備好了,然后再來啟動(dòng)web服務(wù),瀏覽器直接刷新后獲得如下效果:

如果想通過rendertemplate方法傳輸數(shù)據(jù),在html文件中顯示出來,一方面需要在render_template函數(shù)中加入數(shù)據(jù)參數(shù),如data=msg,這里msg為參數(shù)值,data為參數(shù)名。在html文件中就需要使用jinjia2模板里的數(shù)據(jù)控制語法:

{% python語句 %}{{ 變量 }}我們繼續(xù)將上述案例代碼修改一下,來測(cè)試一下數(shù)據(jù)傳輸效果:

from flask import Flask,render_templateapp=Flask(__name__)@app.route('/')def index(): msg="my name is caojianhua, China up!" return render_template("index.html",data=msg) #加入變量傳遞if __name__=="__main__": app.run(port=2020,host="127.0.0.1",debug=True)然后在index.html中修改:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>welcome to 2020</title></head><body> welcome to my webpage <hr> <p>這是采用render_template模板方法獲得的內(nèi)容:</p> <br> {{data}} #顯示出傳遞過來的變量?jī)?nèi)容</body></html>保存后重新啟動(dòng)web服務(wù),然后瀏覽器上刷新一下(默認(rèn)瀏覽器地址欄還是127.0.0.1:2020訪問首頁):

如果想在該頁面添加圖片或者css、js文件,就需要使用到flask框架默認(rèn)設(shè)置的static目錄方式,即將這些圖片、css、js文件存放到項(xiàng)目目錄下的static目錄,然后使用路由指向。因此首先在項(xiàng)目目錄下新建一個(gè)static文件夾,然后在里面新建一個(gè)img目錄,存入一張圖片名為main.jpg。在頁面中使用的時(shí)候方式如下:

<img src="{{ url_for('static',filename='img/main.jpg')}}" alt=""> 使用jinjia2模板的url_for路由函數(shù),指定為static目錄下,filename指向具體圖片。

(4)flask開發(fā)簡(jiǎn)單網(wǎng)站

到此為止,我們使用flask框架實(shí)現(xiàn)了一個(gè)網(wǎng)頁的開發(fā),還可以傳輸數(shù)據(jù)。但網(wǎng)站肯定是由多個(gè)網(wǎng)頁構(gòu)成的,多個(gè)網(wǎng)頁之間還要實(shí)現(xiàn)相互鏈接訪問。下面我們?cè)谏鲜龌A(chǔ)上增加兩個(gè)網(wǎng)頁,來說明多網(wǎng)頁開發(fā)和鏈接的方法。

首先在main.py文件增加多個(gè)網(wǎng)頁的路由和調(diào)用函數(shù):

from flask import Flask,render_templateapp=Flask(__name__)@app.route('/')def index(): msg="my name is caojianhua, China up!" return render_template("index.html",data=msg)@app.route('/news') #增加一個(gè)news頁面def newspage(): newsContent="全國(guó)上下一心支持武漢,武漢加油!" return render_template("news.html",data=newsContent)app.route('/product') #增加一個(gè)product頁面def productpage(): return render_template("product.html") if __name__=="__main__": app.run(port=2020,host="127.0.0.1",debug=True)然后根據(jù)路由設(shè)定,在templates文件夾下新增兩個(gè)網(wǎng)頁文件,news.html和project.html。

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>news</title></head><body><p>今日新聞</p><p>2020年1月28日0-24時(shí),浙江省報(bào)告新型冠狀病毒感染的肺炎新增確診病例123例,新增重癥病例11例,新增出院病例2例。</p><hr><p style="color:red">{{data}}</p></body></html>接下來重啟一下main.py文件,在瀏覽器地址欄輸入: 127.0.0.1:2020/news,即可獲得如下頁面:

那如何實(shí)現(xiàn)網(wǎng)頁之間的鏈接呢?比如訪問新聞頁面后想返回首頁或者訪問project頁。我們知道使用a超鏈接可以實(shí)現(xiàn),不過在a超鏈接的href屬性里如何構(gòu)建這種路由呢?

有兩種解決思路,一個(gè)是使用url_for函數(shù),一個(gè)是使用路徑方式。我們來實(shí)現(xiàn)一下,在news.html中加入兩個(gè)超鏈接代碼:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>news</title></head><body><p>今日新聞</p><p>2020年1月28日0-24時(shí),浙江省報(bào)告新型冠狀病毒感染的肺炎新增確診病例123例,新增重癥病例11例,新增出院病例2例。</p><hr><p style="color:red">{{data}}</p><p><a href="/ ">回到首頁</a></p> #回首頁超鏈接<p> <a href="{{ url_for('productpage') }}">去看產(chǎn)品頁</a></p> #產(chǎn)品頁鏈接</body></html>代碼中url_for函數(shù)給定參數(shù)是路由頁面的函數(shù)名,如本例中的產(chǎn)品頁,main.py函數(shù)中路由為/product,但函數(shù)名為productpage,這里a超鏈接需要給定函數(shù)名即projectpage,<a href="{{ url_for('productpage') }} " ?;厥醉摮溄又苯咏o/即可,<a href="/">。也可以直接使用路徑方式,如/product,就是尋找main.py文件的product路由名,這也是指向了productpage函數(shù)。

同樣我們?cè)谑醉摷尤雽?dǎo)航代碼:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>welcome to 2020</title></head><body> welcome to my webpage<ul> <li><a href="/news">查看新聞</a></li> <li><a href="/product">查看產(chǎn)品</a></li></ul> <hr> <p>這是采用render_template模板方法獲得的內(nèi)容:</p> <br> {{data}}</body></html>首頁效果如下:

點(diǎn)擊超鏈接就可以順利訪問其他頁面。這樣就形成了網(wǎng)頁之間的互動(dòng)。

如果想在超鏈接跳轉(zhuǎn)時(shí)攜帶參數(shù),即使得url變成:http://ip/page1?var=value,這種方式,就需要在服務(wù)器文件中稍加修改。例如在上述首頁中查看產(chǎn)品超鏈接中加入?yún)?shù)傳遞,先將超鏈接修改為:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>welcome to 2020</title></head><body> welcome to my webpage<ul> <li><a href="/news">查看新聞</a></li> <li><a href="{{ url_for('productpage',a=50) }}">查看產(chǎn)品</a></li> #注意超鏈接帶參數(shù)a傳遞</ul> <hr> <p>這是采用render_template模板方法獲得的內(nèi)容:</p> <br> {{data}}</body></html>因?yàn)橐D(zhuǎn)到product裝飾器位置,就需要將其修改一下如下:

@app.route('/product/<a>',methods=['GET'])def productpage(a): return render_template("product.html",data=a)此時(shí)在product.html中增加一行讀取這個(gè)data的值:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>product</title></head><body>傳遞過來的值為{{data}}<p>庫克表示,他不會(huì)就5G方面的未來蘋果產(chǎn)品發(fā)表評(píng)論,但表示5G處于“在全球范圍內(nèi)進(jìn)行部署的早期階段”。蘋果對(duì)其現(xiàn)有的iPhone產(chǎn)品線“感到驕傲”</p></body></html>此時(shí)從首頁點(diǎn)擊查看產(chǎn)品鏈接時(shí),就可以順利將參數(shù)傳遞到product.html頁面了。

(5)flask實(shí)現(xiàn)表單數(shù)據(jù)傳輸

為了達(dá)到一個(gè)具有互動(dòng)效果的網(wǎng)站,我們?cè)谑醉撛黾右粋€(gè)用戶登錄和注冊(cè)的鏈接,當(dāng)點(diǎn)擊這個(gè)登錄鏈接時(shí)就彈出登錄頁面,輸入姓名和密碼,進(jìn)行登錄操作。通常情況下使用表單來實(shí)現(xiàn)用戶信息的提交,同時(shí)當(dāng)?shù)卿洺晒螅褂胹ession會(huì)話技術(shù)保存住用戶名信息。

首頁效果如圖:

其代碼參考如下:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>welcome to 2020</title> <style> .rr{float:left;width:50%;}</style></head><body><div style="width:600px;height:30px"> <div class="rr"> welcome to my webpage </div> <div class="rr"> {% if data != '' %} #如果存在data變量的值,就顯示用戶姓名,以及注銷鏈接 <a href="#">{{ data}}</a> <a href="#">注銷</a> {% else %} #否則就顯示登錄與注冊(cè)鏈接 <a href="#">登陸</a> <a href="#">注冊(cè)</a> {% endif %} </div> <div style="clear:both;"></div></div><img src="{{ url_for('static',filename='img/main.jpg')}}" alt=""><hr><ul> <li><a href="/news">查看新聞</a></li> <li><a href="/product">查看產(chǎn)品</a></li></ul></body></html>當(dāng)點(diǎn)擊登錄鏈接時(shí),路由指向main.py中的login,該函數(shù)直接跳轉(zhuǎn)到login.html頁面里。在main.py中這部分代碼如下:

@app.route('/login')def loginpage(): return render_template("login.html")在login.html里設(shè)計(jì)一個(gè)表單輸入,注意form的action指向路由:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>userlogin</title></head><body><center> <h3>用戶登錄頁面</h3> <div> <form action="/loginProcess" method="post"> 用戶名: <input type="text" name="nm"><br> 用戶密碼: <input type="password" name="pwd"> <br> <input type="submit" name="submit" value="登錄"> </form> </div></center></body></html>form中的action路由指向?yàn)閘oginProcess,此時(shí)我們?cè)趍ain.py中增加這個(gè)路由裝飾器及對(duì)應(yīng)的函數(shù),同時(shí)由于涉及表單數(shù)據(jù)的接收,此時(shí)就需要導(dǎo)入flask的request包,調(diào)用其form屬性,具體用法如下:

data=request.form #data為一個(gè)接收表單的數(shù)組對(duì)象或者 name=request.form['nm'] #接收到用戶名文本框的輸入并賦值給name變量此時(shí)loginProcess路由代碼如下:

@app.route('/loginProcess',methods=['POST','GET'])def loginProcesspage(): if request.method=='POST': nm=request.form['nm'] #獲取姓名文本框的輸入值 pwd=request.form['pwd'] #獲取密碼框的輸入值 if nm=='cao' and pwd=='123': return render_template("index.html",data=nm) #使用跳轉(zhuǎn)html頁面路由 else: return 'the username or userpwd does not match!'這里的當(dāng)輸入值滿足條件時(shí),使用了render_template來進(jìn)行頁面渲染,實(shí)際上是不合適的。不過為了說明表單輸入的處理方式,我們先這樣運(yùn)行,如此就基本實(shí)現(xiàn)了表單輸入的接收。

運(yùn)行過程中當(dāng)在首頁點(diǎn)擊登錄時(shí),跳轉(zhuǎn)到login函數(shù)渲染的login.html頁面,在表單中輸入對(duì)應(yīng)內(nèi)容后,點(diǎn)擊提交就來到服務(wù)器文件中的loginProcess裝飾器路徑,在對(duì)應(yīng)的loginProcesspage函數(shù)中,使用request.form來接收表單的輸入。后面的跳轉(zhuǎn)先前采用的render_template是不合適的,如果輸入的正確時(shí)運(yùn)行后,網(wǎng)頁上的url仍然是http://127.0.0.1/loginProcess,而不是首頁url,說明render_templates來實(shí)現(xiàn)url跳轉(zhuǎn)是不合適的。這里調(diào)整一下,選用redirect重定向方式,也就是將render_template修改為:

return redirect(url_for('index'))還是使用到url_for方法,尋找到對(duì)應(yīng)的路由處理函數(shù)。不過不像rendertemplate可以傳遞參數(shù),redirect默認(rèn)參數(shù)里沒有傳值功能,因此如這種用戶注冊(cè),需要使用一下會(huì)話session緩存技術(shù)。也就是將正確的用戶名保存到session數(shù)組變量中。使用的時(shí)候先從flask庫中導(dǎo)入session模塊,同時(shí)為了保證安全,還需要給定一個(gè)app.secret_key:

app.secret_key='any random string' #這里我們直接給定一個(gè)密鑰然后在剛才登錄loginProcess代碼中增加一個(gè)session會(huì)話存儲(chǔ)功能:

@app.route('/loginProcess',methods=['POST','GET'])def loginProcesspage(): if request.method=='POST': nm=request.form['nm'] pwd=request.form['pwd'] if nm=='cao' and pwd=='123': session['username']=nm #使用session存儲(chǔ)方式,session默認(rèn)為數(shù)組,給定key和value即可 return redirect(url_for('index')) #重定向跳轉(zhuǎn)到首頁 else: return 'the username or userpwd does not match!'接下來在首頁index.html頁面中修改一下:

<div class="rr"> {% if session['username'] == 'cao' %} #如果session中用戶名為cao,以及注銷鏈接 <a href="#">{{ session['username']}}</a> <a href="#">注銷</a>這樣就完整實(shí)現(xiàn)了用戶的登錄,當(dāng)然這里的用戶目前只限定了一個(gè)人名cao。如下為用戶登錄界面以及登錄后首頁的效果。

(6)公用變量存儲(chǔ)使用

在web開發(fā)時(shí)涉及變量和數(shù)據(jù)的使用是非常復(fù)雜的。對(duì)于頁面之間的共同需要使用的變量,可以使用緩存技術(shù)保存在瀏覽器中,也可以在服務(wù)器端存儲(chǔ)到數(shù)據(jù)庫里后面再取用。例如對(duì)于有些網(wǎng)站需要保存用戶登錄狀態(tài),或者臨時(shí)存儲(chǔ)部分?jǐn)?shù)據(jù),除了采用session會(huì)話、cookie等緩存技術(shù)外,flask框架也提供了處理上下文的方式全局g對(duì)象和context處理。

g對(duì)象使用起來較為簡(jiǎn)單,直接賦予其屬性即可。如g.name、g.attrs等。

from flask import gg.name='cao' 在當(dāng)前頁面請(qǐng)求中就可以直接使用g的值了。

context上下文處理可以在局部也可以在全局。例如想定義一下全局公用變量,可以采用如下方式:

@app.context_processordef common(): isLogin=False return isLogin這樣代碼中的isLogin變量就會(huì)在項(xiàng)目業(yè)務(wù)中通用。

(7)flask與數(shù)據(jù)庫連接,實(shí)現(xiàn)新聞讀取

上述表單的處理已經(jīng)涉及到了一些動(dòng)態(tài)交互處理技術(shù),不過因?yàn)橛懻摫韱蔚奶幚矸绞?,所以沒有涉及數(shù)據(jù)庫的操作。由于main.py實(shí)際上就是一個(gè)服務(wù)器上的后端處理程序,后端就可能會(huì)與數(shù)據(jù)庫鏈接來實(shí)現(xiàn)數(shù)據(jù)的持久性存儲(chǔ)和查詢讀取。

鑒于python中自帶sqlite輕量型數(shù)據(jù)庫,我們?cè)谶@里直接使用即可。前面也有文章討論過在python中來操作數(shù)據(jù)庫,鏈接為:

我們可以直接使用其中的方法來實(shí)現(xiàn)本案例,不過還需要結(jié)合flask框架來實(shí)施。

首先在web2020項(xiàng)目文件夾下新建一個(gè)dbutil.py文件,專門用于處理數(shù)據(jù)庫相關(guān)業(yè)務(wù)。然后在代碼窗口將增刪改查業(yè)務(wù)代碼編寫好,這里直接參考上述的鏈接代碼:

class dbUtils: def __init__(self, dbName): # 連接數(shù)據(jù)庫 import sqlite3 self.conn = sqlite3.connect(dbName) def db_action(self, sql, actionType=0): # 進(jìn)行相關(guān)業(yè)務(wù)操作 try: res = self.conn.execute(sql) if actionType == 1: # 當(dāng)操作類型為1時(shí)代表為查詢業(yè)務(wù),返回查詢列表 return res.fetchall() else: # 當(dāng)操作類型不為1時(shí)代表為新增、刪除或更新業(yè)務(wù),返回邏輯值 return True except ValueError as e: print(e) def close(self): # 關(guān)閉數(shù)據(jù)庫 self.conn.commit() self.conn.close()#1.創(chuàng)建數(shù)據(jù)庫db=dbUtils('web2020.db')#2.創(chuàng)建新聞表sql='create table news (newsid int, content text, author text)'if db.db_action(sql,0)==True: print("創(chuàng)建新聞表成功!")else: print("try again1")#3.新增新聞sql= "insert into news values(1,'武漢疫情非常嚴(yán)重,口罩等急需物品短缺','cao')," / "(2,'全國(guó)人民都給武漢加油,疫情肯定會(huì)控制住','cao')"if db.db_action(sql,0)==True: print("新增新聞表成功!")else: print("try again1")db.close()執(zhí)行后,就完成了新聞表的創(chuàng)建,同時(shí)新增了兩條新聞。

接下來在main.py文件中修改一下newspage方法,用于讀取數(shù)據(jù)庫中的兩條新聞,并顯示在新聞頁面中。

@app.route('/news')def newspage(): import dbutil #導(dǎo)入dbutil模塊,就是上面這個(gè)文件 db=dbutil.dbUtils('web2020.db') #鏈接web2020數(shù)據(jù)庫 sql='select * from news' #組裝查詢sql語句 newslist=db.db_action(sql,1) #查詢處理并返回列表 db.close() #關(guān)閉數(shù)據(jù)庫 return render_template("news.html",data=newslist) #將數(shù)據(jù)傳遞到news.html頁面中然后在news.html頁面中使用jinjia2模板中的語法來讀取兩條新聞內(nèi)容:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>news</title></head><body><p>今日新聞</p>{% for item in data %} #采用循環(huán)來讀取列表中的內(nèi)容 <p style="color:red">{{item}}</p>{% endfor %}<hr><p><a href="/ ">回到首頁</a></p><p> <a href="{{ url_for('productpage',a=50) }}">去看產(chǎn)品頁</a></p></body></html>運(yùn)行結(jié)果如下:

(8)flask藍(lán)圖及模板使用

藍(lán)圖是flask框架為解決項(xiàng)目框架搭建的工具。前面我們將一個(gè)網(wǎng)站所有的路由文件都放在main.py服務(wù)器文件中,簡(jiǎn)單的業(yè)務(wù)處理是沒問題,但隨著業(yè)務(wù)量需求增多,在不斷擴(kuò)展時(shí)將所有路由配置都放在一個(gè)文件里肯定是不行了,需要分業(yè)務(wù)來配置路由及模型,此時(shí)就可以使用flask框架提供的blueprint類來實(shí)現(xiàn)。

還是以上面案例為基礎(chǔ),來討論使用blueprint藍(lán)圖的方法。上面案例包括首頁、用戶注冊(cè)、新聞、產(chǎn)品介紹業(yè)務(wù),由此我們可以將這幾個(gè)業(yè)務(wù)分開單獨(dú)各成一個(gè)路由處理文件。

首先在web2020目錄下新建三個(gè)py文件,分別命名為user.py、news.py、product.py。每個(gè)文件處理對(duì)應(yīng)的業(yè)務(wù)。在每個(gè)文件里都使用blueprint模塊,以u(píng)ser.py為例,使用的方法如下:

from flask import Blueprint, render_template, session, url_for,requestfrom werkzeug.utils import redirectuser=Blueprint('user',__name__) #藍(lán)圖使用方法,參數(shù)里給定文件名,還可以給定url前綴@user.route('/login') #使用user的路由配置def loginpage(): return render_template("login.html")@user.route('/loginProcess',methods=['POST','GET']) #使用user 的路由配置def loginProcesspage(): if request.method=='POST': nm=request.form['nm'] pwd=request.form['pwd'] if nm=='cao' and pwd=='123': session['username']=nm print(session['username']) return redirect(url_for('index')) else: return 'the username or userpwd does not match!'可以看到其中主要的語句為:

user=Blueprint('user',__name__) #藍(lán)圖使用方法,參數(shù)里給定文件名,還可以給定url前綴將user.py文件名user作為藍(lán)圖來使用傳入Blueprint方法中,另外如果需要還可以在這里加入url前綴限定:url_prefix=‘/user'。整個(gè)參數(shù)包括有很多,這里截圖如下:

與user.py一樣,將其他的news.py和product.py文件中代碼也編寫好。

from flask import Blueprint, render_templatenews=Blueprint('news',__name__) #news藍(lán)圖@news.route('/news')def newspage(): import dbutil db=dbutil.dbUtils('web2020.db') sql='select * from news' newslist=db.db_action(sql,1) return render_template("news.html",data=newslist)@news.route('/news/edit')def newsEditpage(): return '/news/edit'如下為product.py藍(lán)圖:

from flask import Blueprint, render_templateproduct=Blueprint('product',__name__)@product.route('/product')def productpage(): return render_template("product.html")這樣就將各個(gè)業(yè)務(wù)單獨(dú)分開處理了,最后我們?cè)趍ain.py主路由文件中將上述的文件采用藍(lán)圖注冊(cè)方式導(dǎo)入即可。

from flask import Flask, render_template, url_for, request, redirect, sessionfrom news import news #導(dǎo)入news藍(lán)圖from user import user #導(dǎo)入user藍(lán)圖from product import product #導(dǎo)入product藍(lán)圖app=Flask(__name__)app.secret_key='any random string'urls=[news,user,product] #將三個(gè)路由構(gòu)建數(shù)組for url in urls: app.register_blueprint(url) #將三個(gè)路由均實(shí)現(xiàn)藍(lán)圖注冊(cè)到主app應(yīng)用上@app.route('/')def index(): userinfo='' return render_template("index.html",data=userinfo)if __name__=="__main__": print(app.url_map) #打印url結(jié)構(gòu)圖 app.run(port=2020,host="127.0.0.1",debug=True)保存好幾個(gè)文件后,從main.py中執(zhí)行啟動(dòng)服務(wù),在瀏覽器地址欄里可以順利瀏覽本案例實(shí)現(xiàn)的網(wǎng)站,這已經(jīng)測(cè)試正常通過。

藍(lán)圖模塊非常有利于網(wǎng)站業(yè)務(wù)邏輯的部署,大大提高維護(hù)有效性,尤其是在復(fù)雜業(yè)務(wù)處理時(shí)分而治之思想非常有效。另外在頁面開發(fā)過程中,還有網(wǎng)頁頁面的一些共享需要,比如對(duì)于一個(gè)網(wǎng)站,頁面頭部和底部基本都是相同的,有時(shí)候側(cè)邊導(dǎo)航欄也是一樣的,那在開發(fā)時(shí)就沒有必要每個(gè)頁面都重新寫一遍相同內(nèi)容的代碼。我們可以將這些公用相同的內(nèi)容做成模板,在需要的頁面里調(diào)用即可。

flask框架在頁面模板制作方面主要依賴于jinjia2。繼續(xù)上述案例,此時(shí)我們?cè)趙eb2020項(xiàng)目文件夾下的templates文件夾(即存放html網(wǎng)頁的文件夾)里新建一個(gè)common.html,即公用模板html文件,寫入代碼如下:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>{% block title %}Title {% endblock %} </title></head><body> {% block header %} <div>header</div> {% endblock %} {% block container %} <div>content</div> {% endblock %} {% block footer %} <div>made by Dr.Cao</div> {% endblock %}</body></html>如代碼中,使用了{(lán)% block header %}--{% endblock %}這樣的代碼對(duì),中間放置對(duì)應(yīng)頁面區(qū)域的html代碼,如在common.html中將頁面整體劃分了三個(gè)區(qū)域,header、container和footer。假設(shè)網(wǎng)站的每個(gè)網(wǎng)頁都擁有相同的header和footer部分,就可以在common.html中將這兩部分內(nèi)容設(shè)計(jì)好。如果需要修改,就直接修改這個(gè)文件即可,別的網(wǎng)頁就會(huì)即時(shí)響應(yīng)變化。container主體內(nèi)容部分肯定是每個(gè)頁面都是不一樣的。

設(shè)定好模板文件后,接下來在各個(gè)頁面使用的時(shí)候采用 {% extends 'common.html' %}將模板導(dǎo)入。例如將上述案例中的product.html文件修改一下,使用模板方式創(chuàng)建:

{% extends 'common.html' %} #導(dǎo)入模板文件{% block title %}產(chǎn)品頁面 {% endblock %} #修改模板中的網(wǎng)頁標(biāo)題內(nèi)容部分保存好所有文件,重啟main.py服務(wù)器文件,然后打開瀏覽器,在地址欄輸入: http://127.0.0.1/product,其內(nèi)容顯示如下:

可以看到頁面標(biāo)題已經(jīng)顯示為新的內(nèi)容。

如果將頁面頭部和底部設(shè)計(jì)多一些內(nèi)容,可以修改common.html文件,如下:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>{% block title %}Title {% endblock %} </title> <style> .header,.footer{height:35px;width:100%;margin:0 auto;background:#333;color:#f0f0f0;} .header li{list-style:none;display:inline;width:300px;margin:0px 20px;} .container{height:100px;width:100%;border:1px solid #f30;} .footer{font-size:12px;text-align:center;height:20px;} </style></head><body> {% block header %} <div class="header"> #頭部區(qū)域的導(dǎo)航 <ul> <li>首頁</li> <li>最近新聞</li> <li>最新產(chǎn)品</li> <li>人力需求</li> <li>聯(lián)系我們</li> </ul> </div> {% endblock %} {% block container %} #中部?jī)?nèi)容塊區(qū)域 <div class="container">中部業(yè)務(wù)內(nèi)容</div> {% endblock %} {% block footer %} #底部區(qū)域 <div class="footer"> Made by PeterCao,2020.聯(lián)系方式:caoln2003@126.com </div> {% endblock %}</body></html>然后再來瀏覽產(chǎn)品頁,效果就變成了:

其他頁面都可以去單獨(dú)修改中部?jī)?nèi)容區(qū)域的html代碼就行了。這樣頭尾都較為固定的樣式使得整個(gè)網(wǎng)站規(guī)格和風(fēng)格較為統(tǒng)一。

到此為止,有關(guān)flask的基本實(shí)踐應(yīng)用就結(jié)束了,在這個(gè)過程中我們也完成了一個(gè)簡(jiǎn)單網(wǎng)站的搭建,實(shí)現(xiàn)了網(wǎng)頁內(nèi)容顯示、網(wǎng)頁相互之間鏈接跳轉(zhuǎn)、網(wǎng)頁之間數(shù)據(jù)的傳輸通信、session會(huì)話以及與數(shù)據(jù)庫的鏈接操作。從實(shí)踐過程來看,如果之前有一些web開發(fā)的基礎(chǔ),幾乎只要一天就可以完全掌握使用flask框架來開發(fā)web的基本技術(shù)。另外flask框架也提供了類似jquery或者ajax異步通信的模塊。由此看來,flask框架實(shí)在是有助于實(shí)現(xiàn)很多功能,比如可以將爬蟲的結(jié)果基于flask來開發(fā)一個(gè)爬蟲結(jié)果顯示的網(wǎng)站,同時(shí)進(jìn)一步使用python提供的相關(guān)計(jì)算分析工具來挖掘數(shù)據(jù)特征。

74
73
25
news

版權(quán)所有? 億企邦 1997-2022 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉