13.python中web架構概念的引入。

來源:互聯網
上載者:User

標籤:web架構   python   

一、什麼是web架構?

架構,就是一個為解決一個開放性問題而設計的具有一定約束性的支撐結構,使用架構可以幫你快速開發特定的系統,簡單地說,就是你用別人搭建好的舞台來做表演。

對於所有的Web應用,本質上其實就是一個socket服務端,使用者的瀏覽器其實就是一個socket用戶端。

   最簡單的Web應用就是先把HTML用檔案儲存好,用一個現成的HTTP伺服器軟體,接收使用者請求,從檔案中讀取HTML,返回。

如果要動態產生HTML,就需要把上述步驟自己來實現。不過,接受HTTP請求、解析HTTP請求、發送HTTP響應都是苦力活,如果我們自己來寫這些底層代碼,還沒開始寫動態HTML呢,就得花個把月去讀HTTP規範。

      正確的做法是底層代碼由專門的伺服器軟體實現,我們用Python專註於產生HTML文檔。因為我們不希望接觸到TCP串連、HTTP原始請求和響應格式,所以,需要一個統一的介面,讓我們專心用Python編寫Web業務。

這個介面就是WSGI:Web Server Gateway Interface。


二、關於WSGI介面。

基本使用示範:

例1:

#!/usr/bin/python2.7

# -*- coding:utf-8 -*-

import wsgiref.simple_server

def app(env,start_response):

    print env  #這個變數可以接收服務端和用戶端的一些相關資訊。

    print start_response

    start_response(‘200 ok‘,[(‘Content-Type‘,‘text/html‘)]) #設定回應標頭

    return [‘<h1>hello!!</h1>‘]

httpd = wsgiref.simple_server.make_server(‘127.0.0.1‘,8888,app)

print "http port on 8888!!!"

httpd.serve_forever()



print environ[‘PATH_INFO‘] #擷取網域名稱後的網站路徑資訊。

    path=environ[‘PATH_INFO‘]

    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])

    f1=open("index1.html","rb")

    data1=f1.read()

    f2=open("index2.html","rb")

    data2=f2.read()

    if path=="/yuan": #根據網域名稱後面的路徑來判斷,返回哪些不同的頁面。

        return [data1]

    elif path=="/alex":

        return [data2]

    else:

        return ["<h1>404</h1>".encode(‘utf8‘)]

前面我們定義的app函數並沒有任何可以解析http協議的部分,也就是說底層代碼不需要我們自己編寫,

我們只負責在更高層次上考慮如何響應請求就可以了。


我們自訂的app()函數必須由WSGI伺服器來調用。有很多符合WSGI規範的伺服器,我們可以挑選一個來用。


app()函數就是符合WSGI標準的一個HTTP處理函數,它接收兩個參數:

  1. 第一個參數為一個包含所有HTTP請求資訊的dict對象。

  2. 另外一個參數接收的則是一個函數體,這個函數體用於發送回應標頭。

在前面定義的app函數中調用start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])

此時會發送一個http回應標頭部,注意Header只能發送一次,也就是只能調用一次start_response()函數。


start_response()函數接收兩個參數,

一個是HTTP響應碼,一個是一組list表示的HTTP Header,每個Header用一個包含兩個str的tuple表示。

通常情況下,都應該把Content-Type頭髮送給瀏覽器。其他很多常用的HTTP Header也應該發送。

然後,函數的傳回值‘<h1>Hello, web!</h1>‘將作為HTTP響應的Body發送給瀏覽器。

有了WSGI,我們關心的就是如何從environ這個dict對象拿到HTTP請求資訊,然後構造HTML,

通過start_response()發送Header,最後返回Body。




例2:

from wsgiref.simple_server import make_server

def f1():

    f1=open("index1.html","rb")

    data1=f1.read()

    return [data1]

def f2():

    f2=open("index2.html","rb")

    data2=f2.read()

    return [data2]

def app(environ, start_response):

    print(environ[‘PATH_INFO‘])

    path=environ[‘PATH_INFO‘]

    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])

    if path=="/p1":

        return f1()

    elif path=="/p2":

        return f2()

    else:

        return ["<h1>404</h1>".encode("utf8")]

httpd = make_server(‘‘, 8502, application)

print ‘Serving HTTP on port 8084...‘

# 開始監聽HTTP請求:

httpd.serve_forever()


例3:

from wsgiref.simple_server import make_server

def f1(req):

    print(req)

    print(req["QUERY_STRING"])

    f1=open("index1.html","rb")

    data1=f1.read()

    return [data1]

def f2(req):

    f2=open("index2.html","rb")

    data2=f2.read()

    return [data2]

import time

def f3(req):        #模版以及資料庫

    f3=open("index3.html","rb")

    data3=f3.read()

    times=time.strftime("%Y-%m-%d %X", time.localtime())

    data3=str(data3,"utf8").replace("!time!",str(times))

    return [data3.encode("utf8")]

def routers():

    urlpatterns = (

        (‘/p1‘,f1),

        (‘/p2‘,f2),

        ("/cur_time",f3)

    )

    return urlpatterns

def application(environ, start_response):

    print(environ[‘PATH_INFO‘])

    path=environ[‘PATH_INFO‘]

    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])

    urlpatterns = routers()

    func = None

    for item in urlpatterns:

        if item[0] == path:

            func = item[1]

            break

    if func:

        return func(environ)

    else:

        return ["<h1>404</h1>".encode("utf8")]

httpd = make_server(‘‘, 8518, application)

print(‘Serving HTTP on port 8084...‘)

# 開始監聽HTTP請求:

httpd.serve_forever()



三、關於web架構的MVC與MTV模式。

MVC模式:

所謂MVC就是把web應用分為模型(M),控制器(C),視圖(V)三層;他們之間以一種外掛程式似的,松耦合的方式串連在一起。

M則是“模型”,模型則是應用程式的核心(比如:資料庫中的表)


V代表“視圖”,這裡面所說的“視圖”,個人理解為商務邏輯,也可以理解為是應用程式中處理資料顯示的部分。(通常,“視圖”是根據“模型”中的資料建立出來的。)

視圖就是由HTML元素組成的介面,在新式的Web應用程式中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術已層出不窮,它們包括Adobe Flash和像XHTML,XML/XSL,WML等一些標識語言和Web services.


!!!注意!!MVC中的“視圖”和MTV中的“視圖”不是同一概念!!!MTV中的視圖指的是商務邏輯,負責商務邏輯,並在適當的時候調用Model和Template,MVC中的“視圖”則是指html文檔!!



C代表“控制器”,“控制器”用來處理和使用者的互動。(通常控制器負責從視圖讀取資料,控制使用者輸入,並向模型發送資料。)

650) this.width=650;" src="https://s4.51cto.com/wyfs02/M02/98/9A/wKiom1k-ixTgIyGdAACCQD6BZq8888.jpg-wh_500x0-wm_3-wmp_4-s_1994469744.jpg" title="b03533fa828ba61edbddc04d4034970a304e59a4.jpg" alt="wKiom1k-ixTgIyGdAACCQD6BZq8888.jpg-wh_50" />


模型表示企業資料和商務規則。在MVC的三個組件中,模型擁有最多的處理任務。例如它可能用像EJBs和ColdFusion Components這樣的構件對象來處理資料庫,被模型返回的資料是中立的,就是說模型與資料格式無關,這樣一個模型能為多個視圖提供資料,由於應用於模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重複性。


MTV模式:

django中所使用的是MTV模式。

MTV模式本質上與MVC模式沒有什麼差別,也是各組件之間為了保持松耦合關係,只是定義上有些許不同,Django的MTV分別代表。

M:Model(模型):負責業務對象與資料庫的對象(ORM)

T: Template(模版):負責如何把頁面展示給使用者。

V:View(視圖):負責商務邏輯,並在適當的時候調用Model和Template

此外,Django還有一個url分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Template。


650) this.width=650;" src="https://s4.51cto.com/wyfs02/M00/98/9B/wKioL1k-kGjT2SKxAAGPx0wRyh4896.png" title="mtv.png" alt="wKioL1k-kGjT2SKxAAGPx0wRyh4896.png" />


本文出自 “reBiRTH” 部落格,請務必保留此出處http://suhaozhi.blog.51cto.com/7272298/1934697

13.python中web架構概念的引入。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.