【问题标题】:Flask is loading static files from a different path when a route is called [duplicate]调用路由时,Flask正在从不同的路径加载静态文件[重复]
【发布时间】:2019-12-15 03:26:37
【问题描述】:

我有 2 个路由功能,一个获取所有用户,一个获取特定用户。这两个函数都呈现相同的模板。第一个功能工作正常,问题出在第二个。渲染模板时,它会尝试从另一个目录加载静态文件。

我尝试为每个模板使用不同的模板,但问题仍然存在。

获取所有用户路由:

@app.route('/users')
def list_users():
    users = Users.query.all()
    return render_template('users.html', users=users)

获取一条用户路由:

@app.route('/users/<username>')
def get_user(username):
    user = Users.query.filter_by(name=username).first()
    if user:
        return render_template('users.html', users=[user])

get_user路由函数渲染的模板:

127.0.0.1 - - [07/Aug/2019 13:35:56] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [07/Aug/2019 13:35:57] "GET /favicon.ico HTTP/1.1" 404 -
127.0.0.1 - - [07/Aug/2019 13:36:06] "GET /users/Ana HTTP/1.1" 200 -
127.0.0.1 - - [07/Aug/2019 13:36:06] "GET /users/static/vendor/fontawesome-free/css/all.min.css HTTP/1.1" 404 -
127.0.0.1 - - [07/Aug/2019 13:36:06] "GET /users/static/css/sb-admin-2.min.css HTTP/1.1" 404 -
127.0.0.1 - - [07/Aug/2019 13:36:06] "GET /users/static/img/uatronica_black_transparent.png HTTP/1.1" 404 -
127.0.0.1 - - [07/Aug/2019 13:36:06] "GET /users/static/vendor/jquery/jquery.min.js HTTP/1.1" 404 -
127.0.0.1 - - [07/Aug/2019 13:36:06] "GET /users/static/vendor/bootstrap/js/bootstrap.bundle.min.js HTTP/1.1" 404 -
127.0.0.1 - - [07/Aug/2019 13:36:06] "GET /users/static/vendor/jquery-easing/jquery.easing.min.js HTTP/1.1" 404 -
127.0.0.1 - - [07/Aug/2019 13:36:06] "GET /users/static/js/sb-admin-2.min.js HTTP/1.1" 404 -
127.0.0.1 - - [07/Aug/2019 13:36:06] "GET /users/static/vendor/chart.js/Chart.min.js HTTP/1.1" 404 -
127.0.0.1 - - [07/Aug/2019 13:36:06] "GET /users/static/js/demo/chart-area-demo.js HTTP/1.1" 404 -
127.0.0.1 - - [07/Aug/2019 13:36:06] "GET /users/static/js/demo/chart-pie-demo.js HTTP/1.1" 404 -

它试图从 /users/static/ 而不是 /static/ 加载 css 文件。这是为什么呢?

【问题讨论】:

  • 如果模板使用相对路径,http://host:port/users/Ana 的“当前目录”可能是 /users/。
  • @h4z3 模板正在使用&lt;link href="./static/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css"&gt;。是这个问题吗?
  • 请分享 users.html 的脚本以供审核。
  • @DataFramed 问题解决了,查看大牛的回答。谢谢。

标签: python flask


【解决方案1】:

您在模板中使用相对路径,因此最终 URL 与您所在的任何 URL 相关。查看/users时,如果模板链接到static/css/admin.css,则变为/users/static/css/admin.css。如果路径以/ 开头,则它是一个绝对 URL,不会这样做。

改为使用url_for,无论您身在何处以及如何部署应用,它都会生成绝对 URL。

<link rel="stylesheet" href="{{ url_for('static', filename='css/admin.css') }}>

这变成/static/css/admin.css

【讨论】:

  • 这对我有用。
【解决方案2】:

请使用以下代码。

Get one user route:
@app.route('/users/<username>')
def get_user(username):
 user = Users.query.filter_by(name=username).first()
 return render_template('users.html', users=user)

另外请分享 html 页面 users.html 以供审核。

【讨论】:

  • 更多代码的问题应该是cmets。这也不是 OPs 问题的答案 - 这只是样式偏好(?)并且可能是错误的,因为 user 不是可迭代的(这就是为什么它被放在单元素列表中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 2020-04-13
  • 2018-12-13
  • 2013-10-30
  • 2015-08-29
  • 2019-01-30
相关资源
最近更新 更多