1. http请求的原理
http请求原理其实就是socket连接,服务器发送完成消息后,关闭socket连接
# encoding:utf-8 # @Time : 2021/5/22 7:18 下午 # @Author : yan # @Content: python web框架的版本一, 展示请求静态页面的过程 import socket import re from multiprocessing import Process def service_client(new_socket): """处理浏览器的请求""" # 1. 接收浏览器发送来的数据,解析请求报文的请求行 # GET /index.html HTTP/1.1 request = new_socket.recv(1024).decode("utf-8") # [ # ‘GET /version1 HTTP/1.1‘, # 请求行,解析请求行,找到静态资源 # ‘Host: 127.0.0.1:8888‘, # 请求头,解析请求头,获取session等信息 # ‘Connection: keep-alive‘, # ‘Cache-Control: max-age=0‘, # ‘sec-ch-ua: " Not A;Brand";v="99", # "Chromium";v="90", # "Google Chrome";v="90"‘, ‘ # sec-ch-ua-mobile: ?0‘, # ‘Upgrade-Insecure-Requests: 1‘, # ‘User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36‘, # ‘Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9‘, # ‘Sec-Fetch-Site: none‘, ‘Sec-Fetch-Mode: navigate‘, ‘Sec-Fetch-User: ?1‘, # ‘Sec-Fetch-Dest: document‘, ‘Accept-Encoding: gzip, deflate, br‘, # ‘Accept-Language: zh-CN,zh;q=0.9‘, # ‘Cookie: csrftoken=yuqdKIvcb4n1XDwwM8APng4df84hlLQ1sZead7YBshaS1fITeUI6awsUTEWD1q9L‘, # ‘‘ # 请求体,解析请求体,获得参数 # ] request_lines = request.splitlines() print(request_lines) file_name = "" # 非斜杠,非空格 [取非操作] rule = r"[^/]+(/[^ ]*)" ret = re.match(rule, request_lines[0]) print(ret) if ret: file_name = ret.group(1) if file_name == "/version1": file_name = "/version1.html" try: # 打开对应路径下的html静态页面 f = open("../html" + file_name, "rb") except: # 构造失败标准格式 response = "HTTP/1.1 404 NOT FOUND\r\n" response += "\r\n" response += "----file not found ----" new_socket.send(response.encode("utf-8")) else: # 构造成功的标准格式 html_content = f.read() f.close() response = "HTTP/1.1 200 \r\n" response += "\r\n" # 为什么响应要分为两次发送呢?# TODO 这里必须发送两次 # 先发一个响应行过去,再把响应体发过去, # 这种形式是没有响应头的信息,如何添加响应头信息 new_socket.send(response.encode("utf-8")) new_socket.send(html_content) new_socket.close() def main(): # 1. 创建套接字 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 2. 绑定套接字 tcp_server_socket.bind(("", 8888)) tcp_server_socket.listen(128) try: while True: new_socket, client_addr = tcp_server_socket.accept() p = Process(target=service_client, args=(new_socket,)) p.start() new_socket.close() except: tcp_server_socket.close() if __name__ == ‘__main__‘: main()
# TODO
原文:https://www.cnblogs.com/meloncodezhang/p/14799831.html