Как проверить, является ли ответ файлом во Flask? - PullRequest
0 голосов
/ 20 февраля 2019

Как проверить, является ли ответ файлом в 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 он не содержит file

Я могу сделать if hasattr(response.response, 'file'):

Но в этот момент я начинаю чувствовать, что то, что я делаю, действительно бесполезно, а не так, как должнополучите доступ к имени файла в ответе во Flask.

Подводя итог, каков "правильный" способ проверить, является ли ответ файлом, и если да, получить расширение файла?

1 Ответ

0 голосов
/ 22 февраля 2019

Код 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 и обратно к отображению результатов в браузере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...