【问题标题】:How to check if the response is a file in Flask?如何检查响应是否是 Flask 中的文件?
【发布时间】:2019-02-20 19:21:04
【问题描述】:

如何检查响应是否是 Flask 中的文件,或者更具体地说 - 如果是文件,如何获取响应的文件名?

最终目标是获取响应的文件扩展名,即(.js.css.js.map 等...)。

这是dir(response) 的有用信息

['__call__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_ensure_sequence', '_get_mimetype_params', '_is_range_request_processable', '_on_close', '_process_range_request', '_status', '_status_code', '_wrap_response', 'accept_ranges', 'add_etag', 'age', 'allow', 'autocorrect_location_header', 'automatically_set_content_length', 'cache_control', 'calculate_content_length', 'call_on_close', 'charset', 'close', 'content_encoding', 'content_language', 'content_length', 'content_location', 'content_md5', 'content_range', 'content_type', 'data', 'date', 'default_mimetype', 'default_status', 'delete_cookie', 'direct_passthrough', 'expires', 'force_type', 'freeze', 'from_app', 'get_app_iter', 'get_data', 'get_etag', 'get_wsgi_headers', 'get_wsgi_response', 'headers', 'implicit_sequence_conversion', 'is_sequence', 'is_streamed', 'iter_encoded', 'last_modified', 'location', 'make_conditional', 'make_sequence', 'max_cookie_size', 'mimetype', 'mimetype_params', 'response', 'retry_after', 'set_cookie', 'set_data', 'set_etag', 'status', 'status_code', 'stream', 'vary', 'www_authenticate']

检查response.response 的类型,有时是<class 'werkzeug.wsgi.FileWrapper'>,有时是<class 'tuple'>,如果是tuple,它似乎不包含@987654330 @

我可以if hasattr(response.response, 'file'):

但在这一点上,我开始觉得我正在做的事情真的很糟糕,而不是我应该如何访问 Flask 响应中的文件名。

总结一下,检查响应是否为文件的“正确”方法是什么,如果是,获取文件扩展名?

【问题讨论】:

  • 请发布您的代码

标签: python python-3.x flask


【解决方案1】:

Flask 代码位于客户端-服务器关系的“服务器”端。首先,您需要查看来自客户端的信息,在 Flask 中,该信息位于 request 对象而不是 response 对象中。 request 对象是 dict 类型,因此使用 Python dir() 函数检查它是不合适的。

听起来您希望从浏览器获取某种字符串值中的文件名,并希望获取标识文件类型的名称的扩展部分。因此,这是一个满足您需求的简单示例:

假设:

  1. 具有单个输入字段的模板文件,您可以在其中输入文件名。
  2. 一个模板文件,仅用于显示您提供的文件名的扩展名以及原始文件名。 (我知道这有点傻,但它给了我们需要的机会。)
  3. 一个 Python-Flask 程序,用于显示页面并执行扩展的提取。
  4. 用于启动应用程序的 Python 程序。

这有点过分阐述,但它展示了一个常见的 Flask 项目结构。

模板文件entry.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Entry Form</title>
</head>
<body>
<br/><br/>

<form action="/entry", method="post">
    <label></label>
    <input type="text" name="f_name" value="">
    <br/>
    <input type="submit" value="Submit">
</form>

</body>
</html>

模板文件display.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Display</title>
</head>
<body>
<br/><br/>
Filename Entered: {{ f_info['filename'] }}
Extension is: {{ f_info['extension'] }}
<br/><br/><br/>

<form action="/" method="get">
    <input type="submit" value="Return to Entry Page">
</form>

</body>
</html>

应用目录下的应用程序文件:__init__.py

from flask import Flask, request, render_template

fex = Flask(__name__)


@fex.route('/')
def index():
    return render_template('entry.html')


@fex.route('/entry', methods=['GET', 'POST'])
def file_entry():
    f_info = {'filename': None, 'extension': None}
    if 'f_name' in request.form:
        f_info['filename'] = request.form['f_name']
        dot = f_info['filename'].find('.')
        f_info['extension'] = f_info['filename'][dot:]
    return render_template('display.html', f_info=f_info)

运行文件:fex_run.py

from fex_app import fex

fex.run()

这些文件排列在以下目录结构中:

/home/joe
    |
    |-- /fex_proj       (project directory)
        |
        | -- /fex_app   (application directory)
        .    |
        .    | -- /static  (css, js, etc.)
        .    | -- /templates  (html files)
        .    .    |
        .    .    | -- entry.html
        .    .    | -- display.html
        .    |
        .    | -- __init__.py
        .    
        |
        | -- fex_run.py
        | :

在文件__init__.py中,提取文件名扩展部分的代码如下:

        dot = f_info['filename'].find('.')
        f_info['extension'] = f_info['filename'][dot:]

当然,您的数据可能会以不同的方式打包,但此示例显示了从 HTML 入口页面到 Flask 视图功能并返回到浏览器显示结果的流程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 2022-01-18
    • 1970-01-01
    • 2014-05-15
    • 2014-05-08
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多