• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Django: 之Web框架完美解析

    Web框架解析

      Web通過Socket來監聽客戶端,,一旦發現客戶發送的信息立刻接受。接受之后在服務端查找客戶的請求,找到請求返回給用戶,斷開。這是一個連接,不斷的接收,不斷的返回。

    #!/usr/bin/env python
    #coding:utf-8
    
    import socket
    
    def handle_request(client):
        buf = client.recv(1024)
        client.send("HTTP/1.1 200 OK\r\n\r\n")
        client.send("Hello, Wulaoer")
    
    def main():
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind(('127.0.0.1',8000))
        sock.listen(5)
    
        while True:
            connection, address = sock.accept()
            handle_request(connection)
            connection.close()
    
    if __name__ == '__main__':
        main()
    

    上述實現了Socket的本質,對于python web程序來說,一般會分為兩部分:服務程序和應用程序。服務程序負責對socket服務器進行封裝,并在請求到來時,對請求對各種數據進行整理。應用程序則負責具體的邏輯處理。為了方便應用程序的開發,就出現了眾多的Web框架,例如:Django、Flask、web.py等。不同的框架有不同的開發方式,但是無論如何,開發出的應用程序都要和服務器程序配合,才能為用戶提供服務。這樣,服務器程序就需要為不同當框架提供不同當支持。這樣混亂的局面無論是對于服務器還是框架都是不利的。對服務器來說,需要支持各種不同框架,對框架來說,只有支持它對服務器才能被開發出的應用使用。這個時候,標準化就變得尤為重要。我們就可以設立一個標準,只要服務器程序支持這個標準,框架也支持這個標準,那么它們就可以配合使用。一旦標準確定,雙方各自實現。這樣,服務器可以支持更多支持標準的框架,框架也可以使用更多支持標準的服務器。

      WSGI(Web Server Gateway Interface)是一種規范,它定義使用python編寫的web app與web server之間接口格式,實現web app與web server之間的解藕。

    python標準庫提供的獨立WSGI服務器為wsgiref。

    #!/usr/bin/env python
    #coding:utf-8
    
    from wsgiref.simple_server import make_server
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return '<h1>Hello, web!</h1>'
    
    if __name__ == '__main__':
        httpd = make_server('', 8000, RunServer)
        print "Serving HTTP on port 8000..."
        httpd.serve_forever()
    

    自定義Web框架

    一、框架

    通過python標準庫提供的wsgiref模塊開發一個自己的Web框架

    #!/usr/bin/env python
    #coding:utf-8
    from wsgiref.simple_server import make_server
    
    def wulaoer():
        return 'Hi, How are you wulaoer?'
    
    def laowu():
        return 'Hi, How are you laowu?'
    
    def routers():
    
        urlpatterns = (
            ('/wulaoer/',wulaoer),
            ('/laowu/',laowu),
        )
    
        return urlpatterns
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
        urlpatterns = routers()
        func = None
        for item in urlpatterns:
            if item[0] == url:
                func = item[1]
                break
        if func:
            return func()
        else:
            return '404 not found'
    
    if __name__ == '__main__':
        httpd = make_server('', 8000, RunServer)
        print "Serving HTTP on port 8000..."
        httpd.serve_forever()
    

    運行結果:

    2、模版引擎

    在上一步驟中,對于所有的wulaoer、laowu均返回給用戶瀏覽器一個簡單的字符串,在現實的Web請求中一般會返回一個復雜的符號HTML規則的字符串,所以我們一般將要返回給用戶的HTML寫在指定文件中,然后再返回。如:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>Hi, how are you laowu!</h1>
    </body>
    </html>
    laowu.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>Hi, how are you wulaoer!</h1>
    </body>
    </html>
    wulaoer.html
    #!/usr/bin/env  python
    # --*--coding:utf-8 --*--
    
    from wsgiref.simple_server import make_server
    from jinja2 import Template
    import time
    '''
    內容展示,先讀取打開html在讀取內容,展示
    '''
    
    def laowu():
        # return 'Hi, laowu'
        f = open('html/laowu.html')
        data = f.read()
        return data
    
    def wulaoer():
        # return 'Hi, wulaoer'
        f = open('html/wulaoer.html')
        data = f.read()
        return data
    
    '''
    定義路徑列表
    '''
    url_list = (
        ('/laowu/',laowu),
        ('/wulaoer/',wulaoer),
    )
    
    
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
        func = None
        '''循環列表如果存在就暫時不存在報錯404'''
        for item in url_list:
            if item[0] == url:
                func = item[1]
                break
        if func:
            return func()
        else:
            return '404 not found'
    
    if __name__ == '__main__':
        httpd = make_server('', 8000, RunServer)
        print "Serving HTTP on port 8000..."
        httpd.serve_forever()
    

    上述代碼只能返回給用戶HTML的內容,現實復雜的頁面,還是存在問題的:如何給用戶返回動態內容?

    自定義一套特殊的語法,進行替換

    使用開源的工具jinja2,遵循其指定語法

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>{{ name }}</h1>
        <ul>
            {% for item in user_list %}
            <li>{{ item }}</li>
            {% endfor %}
        </ul>
    
    </body>
    </html>
    index.html
    #!/usr/bin/env  python
    # --*--coding:utf-8 --*--
    
    from wsgiref.simple_server import make_server
    from jinja2 import Template
    
    '''
    利用read讀取html的內容
    '''
    def index():
        f = open('html/index.html')
        result = f.read()
        template = Template(result)
        data = template.render(name='laowu', user_list=['Bom', 'Tom'])
        return data.encode('utf-8')
    
    def laowu():
        # return 'Hi, laowu'
        f = open('html/laowu.html')
        data = f.read()
        return data
    
    def wulaoer():
        # return 'Hi, wulaoer'
        f = open('html/wulaoer.html')
        data = f.read()
        return data
    
    
    url_list = (
        ('/laowu/',laowu),
        ('/index/',index),
        ('/wulaoer/',wulaoer),
    )
    
    
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
        func = None
        for item in url_list:
            if item[0] == url:
                func = item[1]
                break
        if func:
            return func()
        else:
            return '404 not found'
    
    if __name__ == '__main__':
        httpd = make_server('', 8000, RunServer)
        print "Serving HTTP on port 8000..."
        httpd.serve_forever()
    

      遵循jinja2的語法規則,其內部會對指定的語法進行相應的替換,從而達到動態的返回內容,對于模版引擎的本質。

    內容參考鏈接:http://www.cnblogs.com/wupeiqi/articles/5237672.html

    版權聲明:本文為weixin_30790841原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_30790841/article/details/96955994

    智能推薦

    python Web應用框架之django

    簡介: django是一個python Web框架,在重量級選手中最具代表的一個。django成熟、穩定,適合作為企業級網站開發使用。 安裝: pip install django 快速入門: 新建django項目 文件-----新建項目   Django------location django項目目錄如下: manage.py: 一個實用的命令行工具,可以讓你以各種方式與django...

    python之web開發框架(Django)

    目錄 前言 Django項目的創建 創建模塊 修改配置以及創建界面 連接數據庫 可以開始測試 前言 web的開發的開發框架現流行的框架有Django,Flask,Tornado 本次使用的開發框架為Django,使用的版本為2.2.7 最新版本可以更新pip install -U Django Django項目的創建 下載Django包命令:pip install Django 創建項目的話如果是...

    python學習之web框架--Django 002

    Django連接mysql數據庫 涉及的內容有:1,創建app,                         2,注冊app                      ...

    python學習之web框架--Django 001

    python感覺沒學到啥就要結課了,感覺沒做點什么,似乎是沒學過,想起能否用python來寫一個web項目呢? python也有很多好用的web框架,比如Django,flask等等 Django本來就封裝了很多東西,入門比較容易,于是決定選擇Django 話不多說,環境搭建: windows+python3 步驟1:安裝Django 執行命令: (紅色部分是版本號)  pipinsta...

    Django-web框架引入之MVC

    MVC框架 Model(數據庫) View(模板文件) Controller(業務處理) 就等于 MTV Model(數據庫) Templete(模板文件) View(業務處理) 如在Controller中寫一個account.py 作為業務處理模塊 在View中寫入模板文件indel.html 然后主程序下運行 結果就是 小技巧: 在運行過程中,按交互框的方框鍵即終止鍵,然后debug,最后在網...

    猜你喜歡

    django 前奏之web框架本質

    web框架 web應用本質上就是一個socket服務端,用戶的瀏覽器就是socket的客戶端。 ** web 精簡版框架** 可以說web服務本質上都是在這十幾行代碼基礎上擴展出來的。這段代碼就是根本。 用戶在瀏覽器中輸入網址,瀏覽器會向服務端發送數據,而這個數據則要遵守HTTP協議的規則。 瀏覽發送請求信息也好,服務器回復響應響應信息也罷,都要遵守這個規則來。 既然HTTP協議主要規定了客戶端和...

    python web框架之Django隨筆總結

    一.Django中url多級路由總結 1.1 django中多級路由映射 django項目中如果一個項目內又分多個app,那么合理的結構是每一個app都應該有一層api路由,通過一級路由映射到當前app中。 django中所有路由的入口在與settting.py同級的urls.py下,所有applications接口接收到的請求首先會轉發到此入口,然后根據此入口中的路由規則然后將url請求轉發到對...

    python Django之Web框架本質 (2)

    文章目錄 一.Web應用本質 1.socket本質 二.發送HTTP協議、響應 1.HTTP協議 2.HTTP發送響應 靜態網頁 動態網頁 三.jinja2模板渲染 一.Web應用本質 為了了解Django的客戶端與服務端的交互原理,我們需要了解Web應用的本質方便以后更加的理解Django原理 在Web應用中,服務器把網頁傳給瀏覽器,實際上就是把網頁的HTML代碼發送給瀏覽器,讓瀏覽器顯示出來。...

    Django基礎---Web框架、Django的使用

    Django基礎—Web框架 MVC和MTV框架 MVC 把Web應用分為模型(M)、視圖(V)、控制器(C)三層,他們之間以一種插件式的,松耦合的方式聯系在一起。模型負責業務對象與數據庫的映射(ORM),視圖負責與用戶的交互(頁面),控制器接收用戶的輸入調用模型和視圖完成用戶的請求。 MTV Django的MTV模式本質上和MVC是一樣的,也是為了各組件間保持松耦合關系,只是定義上有...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    精品国产乱码久久久久久蜜桃不卡