對于所有的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