如何检查响应是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的响应中访问文件名。
总而言之,检查响应是否为文件的“正确”方法是什么?如果是,则获取文件扩展名?
答案 0 :(得分:0)
烧瓶代码是客户端-服务器关系中“服务器”端的代码。首先,您需要查看来自客户端的信息,在Flask中,该信息位于 request 对象中,而不是 response 对象中。 request 对象是 dict 类型,因此不适合使用Python dir()函数进行检查。
这听起来像是您期望浏览器提供某种形式的字符串值的文件名,并且想要获取标识文件类型的名称的扩展名部分。因此,这是一个满足您需求的简单示例:
假设:
这有点过分详细,但是它展示了一个通用的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视图功能再回到结果的浏览器显示的流程。