Можно ли использовать os.getcwd () в веб-приложении (Flask)? - PullRequest
0 голосов
/ 27 сентября 2018

В файле 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()

static / 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 голосов
/ 27 сентября 2018

Для настройки полного пути вам не нужно использовать url_for в python.

Итак, я рекомендую изменить ваш код:

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')
0 голосов
/ 28 сентября 2018

Чтобы ответить на ваш второй вопрос:

"Но вопрос остается в силе. Разве это не совершенно нормально использовать url_for (...)?"

url_for(static, filename='bla.txt') возвращает /static/bla.txt, а не static/bla.txt.Поскольку начальная косая черта указывает на корень вашего компьютера, вы пытаетесь открыть статическую папку прямо в корне вашего компьютера (которого там нет).

url_for(static, filename='bla.txt')[1:] должно работать, я думаю, но я думаю, что это очень хакерское решение.

Так что нет, это определенно не совсем хорошо, и я бы определенно не рекомендовал его использовать.Маршруты сайта и структура папок - это не одно и то же, и их нельзя смешивать без веской причины (а это не одно).

0 голосов
/ 27 сентября 2018

Использование

import os

и замена строки url_for(...) на:

filename = os.path.join(os.getcwd(), 'static', 'txt', 'number.txt')

- решение.

Но вопрос стоит.Разве это не совсем нормально использовать url_for(...)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...