【Python入門】48.Web開發(fā)之 Web框架與MVC模式

摘要:Web框架的基本介紹;以Flask框架為例創(chuàng)建一個(gè)可登錄的頁面;介紹如何使用MVC模式進(jìn)行Web開發(fā)。


*寫在前面:為了更好的學(xué)習(xí)python,博主記錄下自己的學(xué)習(xí)路程。本學(xué)習(xí)筆記基于廖雪峰的Python教程,如有侵權(quán),請(qǐng)告知?jiǎng)h除。歡迎與博主一起學(xué)習(xí)Pythonヽ( ̄▽ ̄)? *


目錄

Web開發(fā)
Web框架
使用Flask框架
MVC模式
小結(jié)

Web開發(fā)

Web框架

在了解了WSGI之后,我們發(fā)現(xiàn),編寫一個(gè)Web應(yīng)用,其實(shí)就是編寫一個(gè)WSGI的處理函數(shù),針對(duì)每一個(gè)HTTP請(qǐng)求進(jìn)行響應(yīng)。

如果要處理多個(gè)URL,每個(gè)URL又有多個(gè)不同的請(qǐng)求,僅用WSGI接口來處理是很麻煩的。

因此,可以通過Web框架,讓我們專注于一個(gè)函數(shù)來處理一個(gè)URL,而框架的內(nèi)部就是來處理URL到函數(shù)的映射。

常見的Python Web框架FlaskDjango、web.pyBottle、Tornado。

其中Flask框架是如今比較流行的Web框架,我們以Flask框架為例,簡(jiǎn)單介紹Web框架的使用。

使用Flask框架

我們用Flask框架編寫一個(gè)簡(jiǎn)單的可登錄頁面。

首先通過pip安裝Flask:

pip install flask

然后編寫一個(gè)webapp.py,里面處理三個(gè)URL,分別是:

1.GET/:首頁;
2.GET/signin:登錄頁面,顯示登錄表單;
3.POST/signin:處理登錄表單,顯示登錄結(jié)果。

這里一個(gè)URL/signin分別有GET和POST請(qǐng)求,映射到兩個(gè)處理函數(shù)。

Flask是通過裝飾器在內(nèi)部來把URL與函數(shù)關(guān)聯(lián)起來的,具體代碼如下:

from flask import Flask
from flask import request

webapp = Flask(__name__)          # 實(shí)例化一個(gè)Flask應(yīng)用

@webapp.route('/', methods = ['GET', 'POST']        # 添加首頁URL
def home():
    return '<h1>Welcome!</h1>'

@webapp.route('/signin', methods = ['GET']          # 添加登錄頁URL,用于GET請(qǐng)求
def signin_form():
    return '''<form action="/signin" method="post">
              <p><input name="username"></p>
              <p><input name="password" type="password"></p>
              <p><button type="submit">Sign In</button></p>
              </form>'''

@webapp.route('/signin', methods = ['POST'])        # 添加登錄頁URL,用于POST請(qǐng)求
def signin():  
    if request.form['username']=='admin' and request.form['password']=='password':
        return '<h3>Hello, admin!</h3>'
    return '<h3>Bad username or password</h3>'

if __name__=='__main__':
    webapp.run()

相關(guān)代碼解析:
xxx = Flask(__name__),用來實(shí)例化一個(gè)Flask應(yīng)用;
Flask用裝飾器的方法,通過route()函數(shù)來添加URL,傳入的參數(shù)依次為URL,請(qǐng)求方法。

相關(guān)HTML文本解析:
<form>用于創(chuàng)建表單;<p>表示創(chuàng)建一行;<input>用于創(chuàng)建輸入框,其中屬性type="password"表示以密碼形式顯示即*****;<button>用于創(chuàng)建按鈕,其中屬性type="submit"表示可提交。

運(yùn)行webapp.py,可見Flask自帶的Server在端口5000上監(jiān)聽:

![Flask2.png](https://upload-images.jianshu.io/upload_images/13441099-67a324ec2f06c180.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

在瀏覽器中輸入首頁地址http://localhost:5000/,就能看到我們編寫的首頁內(nèi)容:

然后輸入http://localhost:5000/signin,可以看到登錄表單:

Flask3.png

輸入剛剛我們編寫的用戶名和密碼,可以看到登錄結(jié)果:


Flask4.png

如果用戶名或密碼輸入錯(cuò)誤,則會(huì)顯示登錄錯(cuò)誤:

當(dāng)然了,實(shí)際的Web應(yīng)用是要通過數(shù)據(jù)庫來對(duì)比用戶名和密碼,判斷用戶是否能登錄成功。

MVC模式

WSGI讓我們只專注于編寫處理函數(shù),針對(duì)每個(gè)HTTP請(qǐng)求進(jìn)行響應(yīng)就能編寫出Web應(yīng)用。

而Web框架的使用,讓我們只要專注于編寫每個(gè)URL對(duì)應(yīng)的處理函數(shù)即可,簡(jiǎn)化了Web應(yīng)用的開發(fā)過程。

然而,僅僅這樣還是不夠,因?yàn)橐粋€(gè)基本的網(wǎng)頁一般都會(huì)有幾千行的HTML,如果想要在Python中以字符串來編寫出這么多的HTML是不現(xiàn)實(shí)的。

所以,更好的處理方式是準(zhǔn)備好HTML文檔作為模板,要使用時(shí)在Python中調(diào)用,并傳入具體的數(shù)據(jù),形成最終的HTML發(fā)送給用戶。

這種模式就是MVC模式——Model-View-Controller。

Model,模型,負(fù)責(zé)接收具體數(shù)據(jù)并傳遞給View;
View,視圖,負(fù)責(zé)顯示邏輯,在這里就是HTML模板部分,經(jīng)過簡(jiǎn)單的替換后就可以展示給用戶;
Controller,控制器,負(fù)責(zé)業(yè)務(wù)邏輯,Python處理URL的函數(shù)就是Controller。

我們用MVC模式再編寫一個(gè)簡(jiǎn)單的登錄頁面。

在編寫之前,我們需要先安裝一種模板,Python的模板有很多種,F(xiàn)lask默認(rèn)支持的模板是jinja2,所以我們先安裝jinja2:

pip install jinja2

然后,我們編寫MVC中的Model和Controller部分:

from flask import Flask
from flask import request
from flask import render_template

webapp = Flask(__name__)      

@webapp.route('/', methods = ['GET', 'POST'])  
def home():
    return render_template('home.html')        # 返回首頁

@webapp.route('/signin', methods = ['GET'])     
def signin_form():
    return render_template('form.html')          # 返回表單的頁面

@webapp.route('/signin', methods = ['POST'])    
def signin():  
    username = request.form['username']
    password = request.form['password']
    if username=='admin' and password=='password':
        return render_template('signin_ok.html', username=username)              # 返回登錄成功的頁面,并傳入username數(shù)據(jù)
    return render_template('form.html', message='Bad username or password', username=username)

if __name__=='__main__':
    webapp.run()

Flask通過render_template()函數(shù)來實(shí)現(xiàn)模板的渲染。

接下來編寫MVC的View部分,即三個(gè)HTML:

首頁,home.html

<html>
<head>
  <title>Home</title>
</head>
<body>
  <h1 style="font-style:italic">Home</h1>
</body>
</html>

登錄頁面,form.html

<html>
<head>
  <title>Please Sign In</title>
</head>
<body>
  {% if message %}
  <p style="color:red">{{ message }}</p>
  {% endif %}
  <form action="/signin" method="post">
    <legend>Please sign in:</legend>
    <p><input name="username" placeholder="Username" value="{{ username }}"></p>
    <p><input name="password" placeholder="Password" type="password"></p>
    <p><button type="submit">Sign In</button></p>
  </form>
</body>
</html>

登錄成功頁面,signin_ok.html

<html>
<head>
  <title>Welcome, {{ username }}</title>
</head>
<body>
  <p>Welcome, {{ username }}!</p>
</body>
</html>

登錄失敗的頁面通過條件判斷語句加在了form.html里面。

在jinja2模板中,用{% ... %}表示指令,比如上面的if指令:{% if message %}。用{{ name }}表示需要替換的變量。

下面是登錄失敗時(shí)的顯示頁面:


MVC1.png

除了jinja2模板,常見的模板還有:

Mako:用<% ... %>${xxx}的一個(gè)模板;
Cheetah:也是用<% ... %>${xxx}的一個(gè)模板;
Django:Django是一站式框架,內(nèi)置一個(gè)用{% ... %}{{ xxx }}的模板。

小結(jié)

有了Web框架,我們編寫Web應(yīng)用時(shí),專注于URL與對(duì)應(yīng)的處理函數(shù)即可,相比用WSGI簡(jiǎn)單很多;

而通過MVC模式,我們?cè)赑ython代碼中處理Model和Controller部分,在HTML代碼中處理View部分。這樣就可以把Python代碼和HTML代碼分開,便于修改與調(diào)試。


以上就是本節(jié)的全部?jī)?nèi)容,感謝你的閱讀。

下一節(jié)內(nèi)容:異步IO之 協(xié)程

有任何問題與想法,歡迎評(píng)論與吐槽。

和博主一起學(xué)習(xí)Python吧( ̄▽ ̄)~*

?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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