python之web框架(1):完成靜態頁面web服務器


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()



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM