最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python本地搭建靜態(tài)Web服務(wù)器的實現(xiàn)

 更新時間:2023年02月01日 09:18:05   作者:ZSYL  
本文主要介紹了Python本地搭建靜態(tài)Web服務(wù)器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

靜態(tài)Web服務(wù)器-返回固定頁面數(shù)據(jù)

學習目標

能夠?qū)懗鼋M裝固定頁面數(shù)據(jù)的響應(yīng)報文

1. 開發(fā)自己的靜態(tài)Web服務(wù)器

實現(xiàn)步驟:

  • 編寫一個TCP服務(wù)端程序
  • 獲取瀏覽器發(fā)送的http請求報文數(shù)據(jù)
  • 讀取固定頁面數(shù)據(jù),把頁面數(shù)據(jù)組裝成HTTP響應(yīng)報文數(shù)據(jù)發(fā)送給瀏覽器。
  • HTTP響應(yīng)報文數(shù)據(jù)發(fā)送完成以后,關(guān)閉服務(wù)于客戶端的套接字。

2. 靜態(tài)Web服務(wù)器-返回固定頁面數(shù)據(jù)的示例代碼

import socket

# 判斷是否是主模塊的代碼
if __name__ == '__main__':
    # 創(chuàng)建tcp服務(wù)端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 設(shè)置端口號復(fù)用,程序退出端口號立即釋放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 綁定端口號
    tcp_server_socket.bind(("", 8000))
    # 設(shè)置監(jiān)聽
    tcp_server_socket.listen(128)
    # 循環(huán)等待接受客戶端的連接請求
    while True:
        # 等待接受客戶端的連接請求
        new_socket, ip_port = tcp_server_socket.accept()
        # 代碼執(zhí)行到此,說明連接建立成功
        # 接收客戶端的請求信息
        recv_data = new_socket.recv(4096)
        print(recv_data)

        # 打開文件讀取文件中的數(shù)據(jù)
        with open("static/index.html", "r") as file:  # 這里的file表示打開文件的對象
            file_data = file.read()
        # 提示: with open 關(guān)閉文件這步操作不用程序員來完成,系統(tǒng)幫我們來完成

        # 響應(yīng)行
        response_line = "HTTP/1.1 200 OK\r\n"
        # 響應(yīng)頭
        response_header = "Server: PWS/1.0\r\n"
        # 響應(yīng)體
        response_body = file_data

        # 把數(shù)據(jù)封裝成http 響應(yīng)報文格式的數(shù)據(jù)
        response = response_line + response_header + "\r\n" + response_body
        # 把字符串編碼成二進制
        response_data = response.encode("utf-8")
        # 發(fā)送給瀏覽器的響應(yīng)報文數(shù)據(jù)
        new_socket.send(response_data)
        # 關(guān)閉服務(wù)于客戶端的套接字
        new_socket.close()

3. 小結(jié)

編寫一個TCP服務(wù)端程序

tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 循環(huán)接受客戶端的連接請求
while True:
   conn_socket, ip_port = tcp_server_socket.accept()

獲取瀏覽器發(fā)送的http請求報文數(shù)據(jù)

client_request_data = conn_socket.recv(4096)

讀取固定頁面數(shù)據(jù),把頁面數(shù)據(jù)組裝成HTTP響應(yīng)報文數(shù)據(jù)發(fā)送給瀏覽器。

response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body

conn_socket.send(response_data)

HTTP響應(yīng)報文數(shù)據(jù)發(fā)送完成以后,關(guān)閉服務(wù)于客戶端的套接字。

conn_socket.close()

靜態(tài)Web服務(wù)器-返回指定頁面數(shù)據(jù)

學習目標

能夠?qū)懗鼋M裝指定頁面數(shù)據(jù)的響應(yīng)報文

1. 靜態(tài)Web服務(wù)器的問題

目前的Web服務(wù)器,不管用戶訪問什么頁面,返回的都是固定頁面的數(shù)據(jù),接下來需要根據(jù)用戶的請求返回指定頁面的數(shù)據(jù)

返回指定頁面數(shù)據(jù)的實現(xiàn)步驟:

  • 獲取用戶請求資源的路徑
  • 根據(jù)請求資源的路徑,讀取指定文件的數(shù)據(jù)
  • 組裝指定文件數(shù)據(jù)的響應(yīng)報文,發(fā)送給瀏覽器
  • 判斷請求的文件在服務(wù)端不存在,組裝404狀態(tài)的響應(yīng)報文,發(fā)送給瀏覽器

2. 靜態(tài)Web服務(wù)器-返回指定頁面數(shù)據(jù)的示例代碼

import socket
import os


def main():
    # 創(chuàng)建tcp服務(wù)端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 設(shè)置端口號復(fù)用,程序退出端口號立即釋放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 綁定端口號
    tcp_server_socket.bind(("", 8000))
    # 設(shè)置監(jiān)聽
    tcp_server_socket.listen(128)
    # 循環(huán)等待接受客戶端的連接請求
    while True:
        # 等待接受客戶端的連接請求
        new_socket, ip_port = tcp_server_socket.accept()
        # 代碼執(zhí)行到此,說明連接建立成功
        # 接收客戶端的請求信息
        recv_data = new_socket.recv(4096)
        # 判斷接收的數(shù)據(jù)長度是否為0
        if len(recv_data) == 0:
            new_socket.close()
            return

        # 對二進制數(shù)據(jù)進行解碼
        recv_content = recv_data.decode("utf-8")
        print(recv_content)

        # 對數(shù)據(jù)按照空格進行分割
        request_list = recv_content.split(" ", maxsplit=2)
        # 獲取請求的資源路徑
        request_path = request_list[1]
        print(request_path)

        # 判斷請求的是否是根目錄,如果是根目錄設(shè)置返回的信息
        if request_path == "/":
            request_path = "/index.html"

        # 1. os.path.exits
        # os.path.exists("static/" + request_path)
        # 2. try-except

        # 打開文件讀取文件中的數(shù)據(jù), 提示:這里使用rb模式,兼容打開圖片文件
        with open("static" + request_path, "rb") as file:  # 這里的file表示打開文件的對象
            file_data = file.read()
        # 提示: with open 關(guān)閉文件這步操作不用程序員來完成,系統(tǒng)幫我們來完成

        # 代碼執(zhí)行到此,說明文件存在,返回200狀態(tài)信息
        # 響應(yīng)行
        response_line = "HTTP/1.1 200 OK\r\n"
        # 響應(yīng)頭
        response_header = "Server: PWS/1.0\r\n"
        # 響應(yīng)體
        response_body = file_data

        # 把數(shù)據(jù)封裝成http 響應(yīng)報文格式的數(shù)據(jù)
        response = (response_line +
                    response_header +
                    "\r\n").encode("utf-8") + response_body

        # 發(fā)送給瀏覽器的響應(yīng)報文數(shù)據(jù)
        new_socket.send(response)

        # 關(guān)閉服務(wù)于客戶端的套接字
        new_socket.close()


# 判斷是否是主模塊的代碼
if __name__ == '__main__':
    main()
    

3. 小結(jié)

獲取用戶請求資源的路徑

request_list = client_request_conent.split(" ",  maxsplit=2)
request_path = request_list[1]

根據(jù)請求資源的路徑,讀取請求指定文件的數(shù)據(jù)

with open("static" + request_path, "rb") as file:
 	file_data = file.read()

組裝指定文件數(shù)據(jù)的響應(yīng)報文,發(fā)送給瀏覽器

response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
conn_socket.send(response_data)

判斷請求的文件在服務(wù)端不存在,組裝404狀態(tài)的響應(yīng)報文,發(fā)送給瀏覽器

try:
	# 打開指定文件,代碼省略...
except Exception as e:
   conn_socket.send(404響應(yīng)報文數(shù)據(jù))

靜態(tài)Web服務(wù)器-返回404頁面數(shù)據(jù)

import socket
import os


def main():
    # 創(chuàng)建tcp服務(wù)端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 設(shè)置端口號復(fù)用,程序退出端口號立即釋放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 綁定端口號
    tcp_server_socket.bind(("", 8000))
    # 設(shè)置監(jiān)聽
    tcp_server_socket.listen(128)
    # 循環(huán)等待接受客戶端的連接請求
    while True:
        # 等待接受客戶端的連接請求
        new_socket, ip_port = tcp_server_socket.accept()
        # 代碼執(zhí)行到此,說明連接建立成功
        # 接收客戶端的請求信息
        recv_data = new_socket.recv(4096)
        # 判斷接收的數(shù)據(jù)長度是否為0
        if len(recv_data) == 0:
            new_socket.close()
            return

        # 對二進制數(shù)據(jù)進行解碼
        recv_content = recv_data.decode("utf-8")
        print(recv_content)

        # 對數(shù)據(jù)按照空格進行分割
        request_list = recv_content.split(" ", maxsplit=2)
        # 獲取請求的資源路徑
        request_path = request_list[1]
        print(request_path)

        # 判斷請求的是否是根目錄,如果是根目錄設(shè)置返回的信息
        if request_path == "/":
            request_path = "/index.html"

        # 1. os.path.exits
        # os.path.exists("static/" + request_path)
        # 2. try-except

        try:
            # 打開文件讀取文件中的數(shù)據(jù), 提示:這里使用rb模式,兼容打開圖片文件
            with open("static" + request_path, "rb") as file:  # 這里的file表示打開文件的對象
                file_data = file.read()
            # 提示: with open 關(guān)閉文件這步操作不用程序員來完成,系統(tǒng)幫我們來完成
        except Exception as e:
            # 代碼執(zhí)行到此,說明沒有請求的該文件,返回404狀態(tài)信息
            # 響應(yīng)行
            response_line = "HTTP/1.1 404 Not Found\r\n"
            # 響應(yīng)頭
            response_header = "Server: PWS/1.0\r\n"
            # 讀取404頁面數(shù)據(jù)
            with open("static/error.html", "rb") as file:
                file_data = file.read()

            # 響應(yīng)體
            response_body = file_data

            # 把數(shù)據(jù)封裝成http 響應(yīng)報文格式的數(shù)據(jù)
            response = (response_line +
                        response_header +
                        "\r\n").encode("utf-8") + response_body

            # 發(fā)送給瀏覽器的響應(yīng)報文數(shù)據(jù)
            new_socket.send(response)

        else:
            # 代碼執(zhí)行到此,說明文件存在,返回200狀態(tài)信息
            # 響應(yīng)行
            response_line = "HTTP/1.1 200 OK\r\n"
            # 響應(yīng)頭
            response_header = "Server: PWS/1.0\r\n"
            # 響應(yīng)體
            response_body = file_data

            # 把數(shù)據(jù)封裝成http 響應(yīng)報文格式的數(shù)據(jù)
            response = (response_line +
                        response_header +
                        "\r\n").encode("utf-8") + response_body

            # 發(fā)送給瀏覽器的響應(yīng)報文數(shù)據(jù)
            new_socket.send(response)
        finally:
            # 關(guān)閉服務(wù)于客戶端的套接字
            new_socket.close()


# 判斷是否是主模塊的代碼
if __name__ == '__main__':

    main()
    

到此這篇關(guān)于Python本地搭建靜態(tài)Web服務(wù)器的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python本地搭建靜態(tài)Web服務(wù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mac 使用python3的matplot畫圖不顯示的解決

    Mac 使用python3的matplot畫圖不顯示的解決

    今天小編就為大家分享一篇Mac 使用python3的matplot畫圖不顯示的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python字符串處理的8招秘籍(小結(jié))

    Python字符串處理的8招秘籍(小結(jié))

    這篇文章主要介紹了Python字符串處理的8招秘籍,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • help函數(shù)解決python所有文檔信息查看

    help函數(shù)解決python所有文檔信息查看

    這篇文章主要為大家介紹了help函數(shù)解決python所有文檔信息查看示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • python使用PIL給圖片添加文字生成海報示例

    python使用PIL給圖片添加文字生成海報示例

    這篇文章主要介紹了python使用PIL給圖片添加文字生成海報示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Python中裝飾器的一個妙用

    Python中裝飾器的一個妙用

    這篇文章主要介紹了Python中裝飾器的一個妙用,本文是在寫一個爬蟲程序時總結(jié)而來,實現(xiàn)定義一個裝飾器,如果之前取到數(shù)據(jù),就直接取cache的數(shù)據(jù),如果之前沒有取到,那么就從網(wǎng)站拉取,并且存入cache中,需要的朋友可以參考下
    2015-02-02
  • python threading模塊的使用指南

    python threading模塊的使用指南

    python的thread模塊是底層的模塊,python的threading模塊是對thread做了一些包裝的,可以更加方便的被使用。本文詳細的講述了threading模塊的用法
    2021-06-06
  • 關(guān)于tensorflow的幾種參數(shù)初始化方法小結(jié)

    關(guān)于tensorflow的幾種參數(shù)初始化方法小結(jié)

    今天小編就為大家分享一篇關(guān)于tensorflow的幾種參數(shù)初始化方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python實現(xiàn)登錄與注冊功能

    python實現(xiàn)登錄與注冊功能

    這篇文章主要為大家詳細介紹了python實現(xiàn)登錄與注冊功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 簡單了解python的內(nèi)存管理機制

    簡單了解python的內(nèi)存管理機制

    這篇文章主要介紹了簡單了解python的內(nèi)存管理機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • jupyter 實現(xiàn)notebook中顯示完整的行和列

    jupyter 實現(xiàn)notebook中顯示完整的行和列

    這篇文章主要介紹了jupyter 實現(xiàn)notebook中顯示完整的行和列,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論

城步| 福泉市| 秭归县| 黄骅市| 定远县| 景谷| 绥宁县| 宁津县| 科技| 汉寿县| 博罗县| 南宁市| 临泉县| 壤塘县| 大化| 扶风县| 鹤峰县| 九寨沟县| 阿拉善右旗| 贵州省| 扶风县| 普定县| 长沙市| 敦化市| 文登市| 胶州市| 五原县| 简阳市| 菏泽市| 邳州市| 芒康县| 望奎县| 泰来县| 彩票| 临邑县| 沙河市| 田阳县| 简阳市| 临汾市| 上饶县| 景东|