python的web框架(1)
1.首先寫一個最簡單的web服務器,只能給客戶回應一個固定的hello world的頁面。
from socket import *
from multiprocessing import Process
def deal(conn):
recv_data = conn.recv(1024).decode('gb2312')
print(recv_data)
conn.send('HTTP/1.1 200 OK \r\n\r\n <h1>hello world</h1>'.encode('gb2312'))
def main():
s = socket(AF_INET, SOCK_STREAM)
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(('',8000))
s.listen(1023)
while 1:
conn, user_info = s.accept()
print(user_info)
p = Process(target=deal, args=(conn,))
p.start()
conn.close()
if __name__ == '__main__':
main()
2.根據用戶請求的頁面,打開頁面文件,讀取,並回復給用戶,完成多進程web靜態頁面服務器
#!/usr/bin/env python3
# coding:utf-8
from socket import *
from multiprocessing import Process
def deal(conn):
recv_data = conn.recv(1024).decode('gb2312')
recv_data_head = recv_data.splitlines()[0]
print('------', recv_data_head)
request_method, request_path, http_version = recv_data_head.split()
# 去掉url中的?和之后的參數
request_path = request_path.split('?')[0]
if request_path == '/':
request_path = '/index.html'
file_name = "." + request_path
try:
f = open(file_name, 'rb')
except IOError:
conn.send(b'HTTP/1.1 404 ERROR \r\n\r\n <h1>Page is not exsit .</h1>')
return
read_data = f.read()
send_data = b'HTTP/1.1 200 OK \r\n\r\n' + read_data
conn.send(send_data)
f.close()
def main():
s = socket(AF_INET, SOCK_STREAM)
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(('',8000))
s.listen(1023)
while 1:
conn, user_info = s.accept()
print(user_info)
p = Process(target=deal, args=(conn,))
p.start()
conn.close() # 進程會復制出一個新的conn,所以這里的conn需要關閉
if __name__ == '__main__':
main()
3.為了方便操作,可以將之前的函數式編程改成面向對象編程。將所有的方法集成到一個類中,這樣更加方便,也更易於使用者了解和使用。
#!/usr/bin/env python3
# coding:utf-8
from socket import *
from multiprocessing import Process
class MyWebServer(object):
@staticmethod
def deal(conn):
recv_data = conn.recv(1024).decode('gb2312')
recv_data_head = recv_data.splitlines()[0]
print('------', recv_data_head)
request_method, request_path, http_version = recv_data_head.split()
# 去掉url中的?和之后的參數
request_path = request_path.split('?')[0]
if request_path == '/':
request_path = '/index.html'
file_name = "." + request_path
try:
f = open(file_name, 'rb')
except IOError:
conn.send(b'HTTP/1.1 404 ERROR \r\n\r\n <h1>Page is not exsit .</h1>')
return
read_data = f.read()
send_data = b'HTTP/1.1 200 OK \r\n\r\n' + read_data
conn.send(send_data)
f.close()
def __init__(self):
self.s = socket(AF_INET, SOCK_STREAM)
self.s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
self.s.bind(('',8000))
self.s.listen(1023)
def start(self):
while 1:
conn, user_info = self.s.accept()
print(user_info)
p = Process(target=self.deal, args=(conn,))
p.start()
conn.close() # 進程會復制出一個新的conn,所以這里的conn需要關閉
s = MyWebServer()
s.start()