在Web(Flask)应用程序中使用os.getcwd()是否可移植?

时间:2018-09-27 19:15:48

标签: flask

我可以在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()的东西似乎令人讨厌/令人生厌。

3 个答案:

答案 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:]应该可以工作,但是我认为这是一个非常棘手的解决方案。

因此,不完全正确,我绝对不建议您使用它。站点路由和文件夹结构不是一回事,并且在没有充分理由的情况下也不应该混杂在一起(这不是一个原因)。