我正在使用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”调用资源,这一次是找到并加载了文档。)
由于这应该是主页,所以我确实希望它使用根地址。
我希望有人能对此有所启发,并向我解释我的错误所在。
答案 0 :(得分:1)
有趣的问题。我唯一能想到的是,您可能已经指定website.com/static
将所有静态文件保存在WSGI服务器脚本中。因此,flask应用程序不会干扰到website.com/static
的请求,并且这些请求由WSGI服务器处理,后者在文件夹中找不到它们。
使用开发服务器时还会发生此问题吗?
您可以尝试将WSGI设置中的静态服务器更改为website/blueprints/static/website
文件夹吗?
最后,如果这没有帮助,您可以针对这个问题制作一个小型github存储库吗?用这些类型的导入和文件树很难重现此问题。