Flask学习笔记(四):基于Flask网页显示图片


✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️

Flask 实现网页显示图片功能解析

在本示例中,我们使用 Flask 框架创建了一个简单的 Web 应用程序,用于在网页上显示指定路径的图片。以下是对代码的详细分析:

代码结构与功能概述

  1. 导入模块
    from flask import Flask, request, make_response
    from datetime import datetime
    import os
    
    flask 库中导入 Flaskrequestmake_response 类。Flask 用于创建 Web 应用,request 用于处理 HTTP 请求,make_response 用于创建 HTTP 响应。从 datetime 模块导入 datetime 类,用于获取当前时间。导入 os 模块,用于操作系统相关的操作,不过在本代码中未实际使用到该模块的功能。
  2. 创建 Flask 应用实例
    app = Flask(__name__)
    
    创建一个 Flask 应用实例,__name__ 是一个 Python 内置变量,用于指定应用的名称。这里 __name__ 会根据模块的导入方式而有所不同,在主程序中通常为 __main__
  3. 定义图片路径常量
    IMG_PATH = "F:\pycharm/feature_match/4.jpg"
    
    定义一个常量 IMG_PATH,表示要显示的图片的路径。请确保该路径是正确的,并且程序对该路径有读取权限。
  4. 定义路由和视图函数
    @app.route('/display/img/<string:filename>', methods=['GET'])
    def display_img(filename):
        request_begin_time = datetime.today()
        print("request_begin_time", request_begin_time)
        if request.method == 'GET':
            image_data = open(IMG_PATH, "rb").read()
            response = make_response(image_data)
            response.headers['Content-Type'] = 'image/jpg'
            return response
        else:
            pass
    
    • 使用 @app.route 装饰器定义了一个路由 /display/img/<string:filename>,该路由接受一个字符串类型的参数 filename,并且只接受 GET 方法的请求。
    • 定义视图函数 display_img,该函数接受 filename 作为参数。
    • 在函数内部,首先获取请求开始的时间 request_begin_time,并打印出来。这可以用于记录请求的时间戳,方便后续的性能分析或日志记录。
    • 检查请求方法是否为 GET。如果是,使用 open 函数以二进制读取模式("rb")打开指定路径的图片文件,并读取其内容到 image_data 变量中。
    • 使用 make_response 函数创建一个响应对象 response,并将读取的图片数据作为响应内容。
    • 设置响应头的 Content-Typeimage/jpg,这告诉浏览器该响应内容是一张 JPEG 格式的图片。
    • 返回响应对象 response。如果请求方法不是 GET,则不做任何处理(pass)。
  5. 运行 Flask 应用
    if __name__ == '__main__':
        app.run(host='10.16.55.26', port=5001)
    
    使用 if __name__ == '__main__': 语句来确保只有当脚本作为主程序运行时,才会执行 app.run() 启动 Flask 应用。
    • app.run() 方法启动 Flask 应用,host='10.16.55.26' 指定了应用监听的 IP 地址,port=5001 指定了应用监听的端口号。

访问与效果

通过在浏览器中访问 http://10.16.55.26:5001/display/img/4.jpg(其中 10.16.55.26 是你自己的 IP 地址),浏览器会发送一个 GET 请求到该 URL。服务器接收到请求后,会执行 display_img 视图函数,读取指定路径的图片并将其作为响应内容返回给浏览器。浏览器识别到响应头的 Content-Typeimage/jpg,会将响应内容解析为一张图片并显示出来。

可能的改进与优化

  1. 错误处理:目前代码没有对文件读取失败的情况进行处理。例如,如果图片文件不存在或者路径错误,程序会抛出异常。可以添加异常处理代码,使程序更加健壮。
    @app.route('/display/img/<string:filename>', methods=['GET'])
    def display_img(filename):
        request_begin_time = datetime.today()
        print("request_begin_time", request_begin_time)
        if request.method == 'GET':
            try:
                image_data = open(IMG_PATH, "rb").read()
                response = make_response(image_data)
                response.headers['Content-Type'] = 'image/jpg'
                return response
            except FileNotFoundError:
                return "图片文件未找到", 404
            except Exception as e:
                return f"发生错误: {str(e)}", 500
        else:
            pass
    
  2. 动态路径:当前代码中图片路径是固定的,可以考虑将图片路径作为参数传递,或者根据不同的 filename 参数动态生成图片路径,以实现更灵活的图片显示功能。
  3. 缓存控制:可以添加缓存控制头,以提高性能。例如,设置 Cache - Control 头来控制浏览器是否缓存图片。
    @app.route('/display/img/<string:filename>', methods=['GET'])
    def display_img(filename):
        request_begin_time = datetime.today()
        print("request_begin_time", request_begin_time)
        if request.method == 'GET':
            try:
                image_data = open(IMG_PATH, "rb").read()
                response = make_response(image_data)
                response.headers['Content-Type'] = 'image/jpg'
                response.headers['Cache - Control'] ='max - age = 3600'  # 缓存 1 小时
                return response
            except FileNotFoundError:
                return "图片文件未找到", 404
            except Exception as e:
                return f"发生错误: {str(e)}", 500
        else:
            pass
    

通过以上的分析和改进建议,你可以更好地理解和优化这个基于 Flask 的图片显示应用程序,使其更符合实际项目的需求。
在这里插入图片描述
✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZY_dl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值