我可以在templates/index.html
文件中写
<link rel="stylesheet" type="text/css"
href={{ url_for('static', filename='css/main.css') }}>
和url_for
可以从静态文件夹中检索CSS文件(FWIW,尽管css/main.css
在Windows上具有正斜杠)。
我想打开一个静态文件static/number.txt
,从其中读取一个数字,然后显示该数字。
app.py
from flask import Flask, render_template, url_for
app = Flask(__name__)
@app.route('/')
def number():
filename = url_for('static', filename='txt/number.txt')
with open(filename) as f:
number = next(f)
return render_template('index.html', number=number)
if __name__ == '__main__':
app.run()
静态/txt/number.txt
2345
templates / index.html
<body>
{{ number }}
</body>
对于这个简单的示例,我没有尝试通过运行Nginx进行优化
和IIUC这个简单的任务不需要send_from_directory()
也os.getcwd()
。也不需要修补app.static_folder
,也不必担心使用os.join.path()
的文件夹分隔符(我碰巧是在Windows上,但是理想情况下,它应该在代码中不可见)。也无需修改默认的static
文件夹。
上面的代码给了我
c:\read-static>python app.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
ERROR in app: Exception on / [GET]
Traceback (most recent call last):
File "C:\anaconda3\flask\app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
...
File "app.py", line 10, in number
with open(filename) as f:
FileNotFoundError: [Errno 2] No such file or directory: '/static/txt/number.txt'
127.0.0.1 - "GET / HTTP/1.1" 500 -
我想念什么?我应该使用os.getcwd()
在Flask中读取静态文件吗?依赖os.getcwd()
的东西似乎令人讨厌/令人生厌。
答案 0 :(得分:0)
使用
import os
并将url_for(...)
行替换为:
filename = os.path.join(os.getcwd(), 'static', 'txt', 'number.txt')
是解决方案。
但是问题仍然存在。使用url_for(...)
是否完全正确?
答案 1 :(得分:0)
要设置完整路径,您不必在python中使用url_for。
所以,我的建议是更改您的代码:
from os import path # os needed for folder and file address
# receiving address of a current dirrectory
script_dir = path.dirname(path.abspath(__file__))
# adding address of your file
filename = script_dir.join('/static/txt/number.txt')
答案 2 :(得分:0)
要回答第二个问题:
“但是问题仍然存在。使用url_for(...)是否完全可以吗?”
url_for(static, filename='bla.txt')
返回/static/bla.txt
,而不返回static/bla.txt
。由于起始斜杠表示计算机的根目录,因此您尝试直接在PC的根目录(不存在)上打开一个静态文件夹。
url_for(static, filename='bla.txt')[1:]
应该可以工作,但是我认为这是一个非常棘手的解决方案。
因此,不完全正确,我绝对不建议您使用它。站点路由和文件夹结构不是一回事,并且在没有充分理由的情况下也不应该混杂在一起(这不是一个原因)。