如何检查响应是否是Flask中的文件?

时间:2019-02-20 19:21:04

标签: python python-3.x flask

如何检查响应是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'>,如果它是{{1 }}不包含tuple

我可以做file

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

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

1 个答案:

答案 0 :(得分:0)

烧瓶代码是客户端-服务器关系中“服务器”端的代码。首先,您需要查看来自客户端的信息,在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视图功能再回到结果的浏览器显示的流程。