python----web开发

  • 1. Web应用职责介绍

  • 接收web服务器的动态资源请求,给web服务器提供处理动态资源请求的服务。

  • 2. 动态资源判断

  • 根据请求资源路径进行判断

web服务器程序(web.py)代码:

import socket
import threading
import sys
import framework

# 获取用户请求资源的路径
# 根据请求资源的路径,读取指定文件的数据
# 组装指定文件数据的响应报文,发送给浏览器
# 判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器
class HttpWebServer:
   def __init__(self):
       # 1.编写一个TCP服务端程序
       # 创建socekt
       self.tcp_server_socekt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       # 设置端口复用 
       self.tcp_server_socekt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
       # 绑定地址
       self.tcp_server_socekt.bind(("", 8000))
       # 设置监听
       self.tcp_server_socekt.listen(128)

   def handle_client_request(self, client_socekt):
       # 获取浏览器的请求信息
       client_request_data = client_socekt.recv(1024).decode()

       # 获取用户请求信息
       request_data = client_request_data.split("\r\n")

       # 获取请求行数据
       request_line = request_data.pop(0) # 使用pop将请求行数据从列表中取出
       request_line_data = request_line.split(' ')

       # 获取请求头部数据
       request_header = {}
       for data in request_data:
           if data == '':
               continue
           request_header[data.split(": ")[0]]=data.split(": ")[1]

       # 判断客户端是否关闭
       if len(request_line_data) == 1:
           client_socekt.close()
           return

       # 请求行中获取请求资源的路径
       request_path = request_line_data[1]

       # 判断是否有查询字符串数据
       request_query = request_path.split('?')
       if len(request_query) > 1:
           request_path = request_query[0]
           query_str = request_query[1]
       else:
           query_str = None

       # 构造请求数据
       requests = {
           'path':request_path,
           'query_str':query_str,
           'header':request_header
      }

       """动态资源"""
       # 符合wsgi协议的参数
       env = {
           "request_path":request_path,
           "requests":requests
      }

       # 应答行
       response_line = "HTTP/1.1 200 OK\r\n"
       # 应答头
       response_header = "Server:pwb\r\nAccess-Control-Allow-Credentials:true\r\nAccess-Control-Allow-Origin:*\r\nAccess-Control-Allow-Methods:GET, POST, PUT\n\rAccess-Control-Allow-Headers:X-Custom-Header"
       # 应答体
       response_body =framework.handle_request(env)
       # 应答数据
       response_data = response_line + response_header + "\r\n\r\n" + response_body
       # 发送数据给到浏览器
       client_socekt.send(response_data.encode())

       # 关闭和浏览器通讯的socket
       client_socekt.close()


   def start(self):
       while True:
           # 2.获取浏览器发送的HTTP请求报文数据
           # 建立链接
           client_socekt, client_addr = self.tcp_server_socekt.accept()
           # 创建子线程
           sub_thread = threading.Thread(target=self.handle_client_request, args=(client_socekt,))
           sub_thread.start()


if __name__ == '__main__':
   # 创建服务器对象
   my_web_server = HttpWebServer()
   # 启动服务器
   my_web_server.start()
  • 3. 处理客户端的动态资源请求

  1. 创建web应用程序

  2. 接收web服务器的动态资源请求

  3. 处理web服务器的动态资源请求并把处理结果返回给web服务器

  4. web服务器把处理结果组装成响应报文发送给浏览器

web应用程序(framework.py)代码:

"""miniweb,负责处理动态资源请求"""
import re
from pymysql import *
import json


# ajax请求的数据,获取首页数据
def index(env):
   # 创建链接
   conn = connect(host='localhost', port=3306, database='booksite', user='root', password='mysql', charset='utf8')
   # 创建游标
   cursor = conn.cursor()

   # 执行sql语句
   sql = "select * from bookinfo;"
   cursor.execute(sql)

   # 获取数据 元组 ((),())
   stock_data = cursor.fetchall()

   # 把元组转化成列表
   center_data_list =[]
   for data in stock_data:
       center_data_list.append({
           "id":data[0],
           "name":data[1],
           "auth":data[2],
           "img_url":data[3],
           "rank":data[4]
      })
    # 把列表转化成json字符串
   # ensure_ascii = False 控制台中可以显示中文
   json_str = json.dumps(center_data_list, ensure_ascii=False)


   # 关闭连接
   cursor.close()
   conn.close()

   return json_str



# 处理动态资源请求
def handle_request(env):
   # 获取动态请求资源路径
   request_path = env["request_path"]
   print("接收到的动态资源请求:", request_path)

   if request_path == "/index":
       # 获取首页数据
       result = index(env)
       return result
   else:
       # 没有找到动态资源
       return "404 not found..."
  • 4. 小结

  • 动态资源的判断通过请求资源路径来完成

  • 处理客户端的动态资源请求

    1. 接收web服务器的动态资源请求

    2. Web应用程序处理动态资源请求并把处理结果返回给web服务器

    3. web服务器把处理结果组装成响应报文发送给浏览器

posted @ 2021-08-19 08:05  蕊在花中  阅读(206)  评论(0)    收藏  举报