天天看點

python web的進化曆程

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

階段1

socket服務端和用戶端都自己編寫

實作通路8080端口,傳回一個'hello world'

#!/usr/bin/env python
#encoding: utf-8
#@2017-03-30
"""最簡單的web架構"""
 
import socket

def handle_request(client):
    """應用程式,web開發者自定義部分"""
    buf = client.recv(1024)
    client.send('HTTP/1.1 200 OK1

')
    client.send("Hello, world!")
    
def server():
    """服務端程式,web開發者共用部分
    本質:對socket進行封裝"""
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('0.0.0.0', 8080))
    sock.listen(5)
    
    while True:
        connection, address = sock.accept()
        handle_request(connection) # 阻塞
        connection.close()

if __name__ == '__main__':
    server()      

View Code

階段2

WSGI(Web Server Gateway Interface)是一種規範,它定義了使用python編寫的web app與web server之間接口格式,實作web app與web server間的解耦。python标準庫提供的獨立WSGI伺服器稱為wsgiref

實作通路8000端口,傳回一個'hello world'

#!/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 'Hello, world!'

if __name__ == '__main__':
    httpd = make_server('0.0.0.0', 8000, RunServer)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()      

View Code

階段3

一些功能子產品化,逐漸有了django的影子

demo:點選下載下傳

main.py作為程式入口

#!/usr/bin/env python
#coding:utf-8

# 封裝後的服務程式
from wsgiref.simple_server import make_server
from urls import url

def RunServer(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    # 擷取使用者URL
    user_url = environ['PATH_INFO']
    
    # 根據URL不同傳回不同的結果
    for item in url:
        if item[0] == user_url:
            return item[1]()
    else:
        return '<h1>404 not found</h1>'

if __name__ == '__main__':
    httpd = make_server('0.0.0.0', 8000, RunServer)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()      

View Code

views.py方法函數

#!/usr/bin/env python
#coding:utf-8

def index():
    return 'index'

def login():
    return 'login'

def logout():
    return 'logout'

url = (
    ('/index/', index),
    ('/login/', login),
    ('/logout/', logout),
)      

View Code

url到方法函數的映射urls.py

#encoding: utf-8
from views import *

"""指定URL到處理函數的映射"""
url = (
    ('/index/', index),
    ('/login/', login),
    ('/logout/', logout),
)      

View Code