Файл не найден при рендеринге html с использованием flask - PullRequest
1 голос
/ 15 января 2020

Я довольно новичок в использовании flask и у меня есть базовый c вопрос: Как предоставить доступ к HTML, который отображается с использованием flask доступа к stati c файлам (таким как изображения). Вот мой игрушечный пример:

Я хотел бы сделать lo go .svg на сайте. Проект структурирован как

Project 
 |
 + -- static
      |
      + -- logo.svg
 + -- templates
      |
      + -- test.html
 + -- run_flask.py

test. html выглядит следующим образом

<!DOCTYPE>

<html>

    <head>

      <title>demo</title>

      <style>
        body {
          font-family: helvetica neue, helvetica, liberation sans, arial, sans-serif;
          font-size: 14px;
        }

      </style>
    </head>

    <body>
        <img src="./static/logo.svg" id="logo">
    </body>

</html>

, а мой скрипт run_ flask -py содержит:

import flask
from flask import render_template, send_from_directory
from flask_cors import CORS

app = flask.Flask(__name__, static_url_path='')
CORS(app)
app.config["DEBUG"] = True

@app.route('/<string:page_name>/')
def render_static(page_name):
    return render_template('%s.html' % page_name)

app.run(port=5001)

Теперь, когда скрипт запускается, вывод консоли:

Запуск на http://127.0.0.1: 5001 / (нажмите CTRL + C, чтобы выйти)

Пока все хорошо, но в chrome, http://127.0.0.1: 5001 / test / выглядит так:

enter image description here

Я уже посмотрел на Как обслуживать stati c файлы в Flask, так как проблема звучит похоже. Но я на самом деле запутался в том, как предлагаемый send_from_directory может помочь мне здесь.

Может кто-нибудь помочь?

Ответы [ 2 ]

1 голос
/ 15 января 2020

Вы должны удалить аргумент static_url_path при инициализации приложения:

app = flask.Flask(__name__)

По умолчанию flask будет искать в подкаталоге static/ любые файлы stati c. Ваша структура каталогов удовлетворяет этому требованию.

Как отмечает @ roganjo sh, это должно работать в шаблоне с:

<img src="{{ url_for('static', filename='logo.svg') }}" id="logo">

В качестве шага отладки вы можете загрузить http://127.0.0.1:5001/static/logo.svg в браузере, и это должно отображаться правильно.


ОБНОВЛЕНИЕ: re. комментарий

Так что, я думаю, пустая строка по умолчанию соответствует текущему каталогу приложения или вам понадобится / для этого

Всегда хорошо, чтобы исследовать фактический исходный код :

:param static_url_path: can be used to specify a different path for the
                        static files on the web.  Defaults to the name
                        of the `static_folder` folder.
:param static_folder: the folder with static files that should be served
                      at `static_url_path`.  Defaults to the ``'static'``
                      folder in the root path of the application.

Вероятно, вы искали static_folder, который контролирует каталог на основе сервера. static_url_path влияет на URL-путь, по которому файлы * stati c доступны на веб-интерфейсе.

Определенно легче просто придерживаться значений по умолчанию здесь и не определять ни того, ни другого.

0 голосов
/ 15 января 2020

попробуйте

<img src="../static/logo.svg" id="logo">

вместо

<img src="./static/logo.svg" id="logo">

.. указывает его на родительский каталог, а / stati c входит в каталог stati c ,

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