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

摘要:Web框架的基本介紹;以Flask框架為例創建一個可登錄的頁面;介紹如何使用MVC模式進行Web開發。


*寫在前面:為了更好的學習python,博主記錄下自己的學習路程。本學習筆記基于廖雪峰的Python教程,如有侵權,請告知刪除。歡迎與博主一起學習Pythonヽ( ̄▽ ̄)? *


目錄

Web開發
Web框架
使用Flask框架
MVC模式
小結

Web開發

Web框架

在了解了WSGI之后,我們發現,編寫一個Web應用,其實就是編寫一個WSGI的處理函數,針對每一個HTTP請求進行響應。

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

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

常見的Python Web框架FlaskDjangoweb.pyBottleTornado

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

使用Flask框架

我們用Flask框架編寫一個簡單的可登錄頁面。

首先通過pip安裝Flask:

pip install flask

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

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

這里一個URL/signin分別有GET和POST請求,映射到兩個處理函數。

Flask是通過裝飾器在內部來把URL與函數關聯起來的,具體代碼如下:

from flask import Flask
from flask import request

webapp = Flask(__name__)          # 實例化一個Flask應用

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

@webapp.route('/signin', methods = ['GET']          # 添加登錄頁URL,用于GET請求
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請求
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()

相關代碼解析:
xxx = Flask(__name__),用來實例化一個Flask應用;
Flask用裝飾器的方法,通過route()函數來添加URL,傳入的參數依次為URL,請求方法。

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

運行webapp.py,可見Flask自帶的Server在端口5000上監聽:

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

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

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

Flask3.png

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


Flask4.png

如果用戶名或密碼輸入錯誤,則會顯示登錄錯誤:

當然了,實際的Web應用是要通過數據庫來對比用戶名和密碼,判斷用戶是否能登錄成功。

MVC模式

WSGI讓我們只專注于編寫處理函數,針對每個HTTP請求進行響應就能編寫出Web應用。

而Web框架的使用,讓我們只要專注于編寫每個URL對應的處理函數即可,簡化了Web應用的開發過程。

然而,僅僅這樣還是不夠,因為一個基本的網頁一般都會有幾千行的HTML,如果想要在Python中以字符串來編寫出這么多的HTML是不現實的。

所以,更好的處理方式是準備好HTML文檔作為模板,要使用時在Python中調用,并傳入具體的數據,形成最終的HTML發送給用戶。

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

Model,模型,負責接收具體數據并傳遞給View;
View,視圖,負責顯示邏輯,在這里就是HTML模板部分,經過簡單的替換后就可以展示給用戶;
Controller,控制器,負責業務邏輯,Python處理URL的函數就是Controller。

我們用MVC模式再編寫一個簡單的登錄頁面。

在編寫之前,我們需要先安裝一種模板,Python的模板有很多種,Flask默認支持的模板是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數據
    return render_template('form.html', message='Bad username or password', username=username)

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

Flask通過render_template()函數來實現模板的渲染。

接下來編寫MVC的View部分,即三個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 }}表示需要替換的變量。

下面是登錄失敗時的顯示頁面:


MVC1.png

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

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

小結

有了Web框架,我們編寫Web應用時,專注于URL與對應的處理函數即可,相比用WSGI簡單很多;

而通過MVC模式,我們在Python代碼中處理Model和Controller部分,在HTML代碼中處理View部分。這樣就可以把Python代碼和HTML代碼分開,便于修改與調試。


以上就是本節的全部內容,感謝你的閱讀。

下一節內容:異步IO之 協程

有任何問題與想法,歡迎評論與吐槽。

和博主一起學習Python吧( ̄▽ ̄)~*

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容