Я работаю над созданием личного тестового веб-сайта для себя с помощью 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», на этот раз документ найден и загружен.)
Поскольку это должна быть главная страница, я хочу, чтобы она использовала корневой адрес.
Я был бы признателен, если бы кто-то пролил свет на это и объяснил мне, в чем заключается моя ошибка.