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

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


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


目錄

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

Web開發(fā)

Web框架

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

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

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

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

其中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請求,映射到兩個處理函數(shù)。

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

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()函數(shù)來添加URL,傳入的參數(shù)依次為URL,請求方法。

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

運行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/,就能看到我們編寫的首頁內容:

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

Flask3.png

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


Flask4.png

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

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

MVC模式

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

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

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

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

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

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

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

在編寫之前,我們需要先安裝一種模板,Python的模板有很多種,F(xiàn)lask默認支持的模板是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ù)來實現(xiàn)模板的渲染。

接下來編寫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與對應的處理函數(shù)即可,相比用WSGI簡單很多;

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


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

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

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

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

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容