当前位置: 首页 > 工具软件 > MiniWeb > 使用案例 >

Python进阶-miniWeb框架

邵骏喆
2023-12-01

Python进阶系列
Python进阶-网络编程-01
Python进阶-网络编程-02
Python进阶-网络编程-03
Python进阶-多任务编程-01
Python进阶-多任务编程-02
Python进阶-多任务编程-03
Python进阶-正则表达式
Python进阶-数据库编程-01
Python进阶-数据库编程-02
Python进阶-数据库编程-03
Python进阶-数据库编程-04
Python进阶-数据拷贝问题
Python进阶-模块导入问题
Python进阶-miniWeb框架

16.1. 框架概念

  • 静态资源:不是经常变化的资源,往往是固定不变的资源
  • 动态资源:经常变化的资源
  • 模板文件:提供一个显示的模板,显示的的内容不同,但是结构是一样的
  • 服务器的作用:
    1. 接受客户端请求
    2. 响应客户端请求
    3. 调用应用框架获取

16.2. miniWeb框架基本构建

  • 思路:

    • 判断请求的资源路径是否是.py结尾
    • 如果是.py结尾 显示动态内容
    • 如果是.html结尾 显示静态内容
  • 核心代码:

     # 改进动态显示
        # 1.判断后缀
        if file_path.endswith(".py"):
        # 2.让.py显示的内容和.html显示的内容区别分开
            response_body = "This is index Show! %s" % time.ctime()
            response_data = utils.create_http_response("200 OK", response_body.encode())
    

16.3. mimiWeb框架构建-动态显示

  • 思路:

    • 首先必须是.py结尾的文件
    • 判断请求的资源路径,并且根据资源路径不同设置不同的response_body
    • 当请求资源路径不存在,返回404错误
  • 核心代码:

    if file_path == "/index.py":
        response_body = "This is index Show!"
        response_data = utils.create_http_response("200 OK", response_body.encode())
    elif file_path == "/center.py":
        response_body = "This is center Show!"
        response_data = utils.create_http_response("200 OK", response_body.encode())
    elif file_path == "/gettime.py":
        response_body = "helloworld %s" % time.ctime()
        response_data = utils.create_http_response("200 OK", response_body.encode())
    else:
        response_body = "Sorry Page Not Found! 404".encode()
        response_data = utils.create_http_response("404 Not Found", response_body)
    

16.4. 路由列表(django)

  • 实现步骤:

    • 创建urls模块,提供一个路由字典

      字典保存路径和函数的对应关系

      • 导入函数的模块 from application import funs

      • route_dict

      # 定义路由字典
      route_dict = {
          '/index.py' : funs.index,
          '/center.py' : funs.center,
          '/gettime.py' : funs.gettime
      }
      
    • 创建funs模块,提供具体功能对应的函数

      定义路径对应的函数

      def index():
          return "This is index show!"
      
      def center():
          return "This is center show!"
      
      def gettime():
          return "This is gettime show! %s" % time.ctime()
      
    • 修改app文件中动态显示的判断部分

      1. 判断路径是否在路由字典中
      2. 如果在字典中,根据key(请求路径)取出对应的函数的引用
      3. 执行函数,获取函数的返回值,然后赋值给response_body
      if file_path in urls.route_dict:
          # 根据key值,去urls.route_dict中获取值
          func = urls.route_dict[file_path]
          # 根据路由字典,获取函数的引用,执行该函数,返回执行的结果,保存到respon_body变量中
          response_body = func()
          # 调用 utils 模块的create_http_response函数,拼接响应协议
          response_data = utils.create_http_response("200 OK", response_body.encode())
      

16.5. 路由装饰器(flask)

  • 修改urls模块

    route_dict = { }

  • 修改funs模块

    • 导入 from application import urls

    • 创建装饰器工厂

      def route(path):
          # 装饰器
          def function_out(func):
              urls.route_dict[path] = func
              print("装饰[%s]" % path)
              def function_in():
                  return func()
              return function_in
          return function_out
      
    • 装饰函数

      @route("/center.py")
      def center():
          return "This is center show!"
      
  • 在app模块中导入funs模块

    此时funs模块中的函数被加载,加载的同时被装饰(就会向字典中添加路由信息)


16.6. 模板替换

  • 思路

    • 拷贝资源(templates)到工程下

    • 修改funs模块中的index和center函数

    • 在函数中读取对应的文件

      with open("templates/center.html", "r", encoding='UTF-8') as file:    
      # 2.读取文件内容    
      content = file.read()
      
    • 使用正则替换网页中的内容 {%content%} --> helloworld

    • 返回替换后的内容

      return content


16.7. <选股系统-股票信息>数据加载_1

  • 创建并导入数据到数据库

    • 创建数据库 create database stock_db charset = utf-8
    • 使用数据库 use stock_db
    • 导入数据库 (先客户端登录)
    • 准备脚本文件
    • 导入脚本 source stock_db.sql
  • 修改index函数

    • 连接数据库,获取数据

      • 导入模块
      • 建立连接
      • 创建游标
      • 使用游标执行sql
      • 获取查询的结果 : data_from_mysql = str(cur.fetchall())
      • 关闭资源:游标,连接
    • 替换为查询的数据

      content = re.sub("{%content%}", data_from_mysql, content)
      

16.8. <选股系统-股票信息>数据加载_2

  • 思路:

    • 把查询的数据进行遍历,并且拼接html格式的文本

      表示一行 表示一列
    • 替换为拼接后的字符串

      content = re.sub(“{%content%}”, data_from_mysql, content)

    • 注意:

      %s %s %s ----> line # line是一个元组

 类似资料: