Flask - не удается получить доступ к статическим файлам для корневого адреса

Я работаю над созданием личного тестового веб-сайта для себя с помощью Flask, однако я обнаружил поведение, с которым не могу полностью справиться, и мне может понадобиться помощь.

Я разделил свой веб-сайт на отдельные фрагменты, используя систему чертежей Flask, потому что это имеет смысл для моего случая (поскольку я хочу, чтобы он содержал несколько небольших тестовых приложений). Я подозреваю, что моя проблема коренится в структуре моего проекта, поэтому я даю краткий обзор того, что я сделал. Вот моя (упрощенная) настройка проекта:

>File structure:
root (contains some linux start scripts)
  - run.py
  - website (the actual flask project folder)
      - __init__.py (registers blueprints)
      - blueprints
          - __init__.py (empty)
          - website
              - __init__.py (defines routes, creates blueprint)
              - static (static files for this blueprint)
                  - css
                      - example.css
              - templates (render templates for this blueprint)
                  - example.html.j2
          - app1
              - <Same structure as above>
          - app2
              - <Same structure as above>
          - ...

>run.py
from website import createApp
createApp().run(debug=True)


>website/__init__.py:
from flask import Flask, render_template

def createApp():
    app = Flask(__name__)
    app.testing = True

    # Website
    from blueprints.website import website
    app.register_blueprint(website())
    # App1
    from blueprints.app1 import app1
    app.register_blueprint(app1())
    # App2
    from blueprints.app2 import app2
    app.register_blueprint(app2())
    ...
    return app


>website/blueprints/website/__init__.py:
from flask import Blueprint, render_template
bp = Blueprint("website", __name__, url_prefix="/", 
template_folder="templates", static_folder="static")
def website():
    return bp

@bp.route('/')
def index():
    return render_template('example.html.j2')


>website/blueprints/website/templates/example.html.j2
<html>
  <head>
    <link rel="stylesheet", href="{{url_for('website.static', filename='css/example.css')}}">
    <title>Test Page!</title>
  </head>
  <body>
    This is a test page!
  </body>
</html>

Ожидаемый результат: страница должна отображаться со стилем, определенным в example.css
Фактический результат: загрузка документа example.css приводит к ошибке 404.

Поскольку я пытался справиться с этим в течение нескольких часов, я думаю, что прибил проблему к тому, что Flask был странным, когда дело доходит до корневого адреса.

Поскольку схема определяет адрес как url_prefix="/", я получаю доступ к нему, набрав «website.com» в своем браузере. (Браузер пытается вызвать ресурс через «website.com/static/css/example.css», но получает ответ 404.)

Если я изменю адрес на что-то вроде url_prefix="/test" и получу доступ к странице через «website.com/test», таблица стилей будет успешно загружена. (Теперь браузер пытается вызвать ресурс через «website.com/test/static/css/example.css», на этот раз документ найден и загружен.)

Поскольку это должна быть главная страница, я хочу, чтобы она использовала корневой адрес.

Я был бы признателен, если бы кто-то пролил свет на это и объяснил мне, в чем заключается моя ошибка.


person Uebertreiberman    schedule 26.01.2019    source источник


Ответы (1)


Интересный вопрос. Единственное, что я могу придумать, это то, что вы могли указать, что website.com/static содержит все ваши статические файлы в вашем сценарии сервера WSGI. Таким образом, приложение flask не влияет на то, какие запросы к website.com/static и эти запросы обрабатываются сервером WSGI, который не может найти их в папке.

Возникает ли эта проблема и при использовании сервера разработки?

Можете ли вы попробовать изменить статический сервер в настройках WSGI на папку website/blueprints/static/website?

И, наконец, если это не поможет, можете ли вы сделать небольшой репозиторий на github с этой проблемой? Довольно сложно воспроизвести эту проблему с такими видами импорта и файловыми деревьями.

person Joost    schedule 27.01.2019
comment
Среда уже представляет собой сервер разработки Flask, который работает на сервере Linux друга. Я никогда не изучал WSGI, мне потребуется немного времени, чтобы проверить это, так как мне нужно немного поэкспериментировать, я вернусь с результатами этого. - person Uebertreiberman; 27.01.2019