Приложение Flask WTForms создает файл для загрузки. Пользователи получают чужой файл (то же имя). Как исправить? ⇐ Python
Приложение Flask WTForms создает файл для загрузки. Пользователи получают чужой файл (то же имя). Как исправить?
Мое приложение создает файл на сервере на основе ввода в WTForms. Имя файла никогда не меняется. Когда приходит новый пользователь, заполняет форму, и старый файл перезаписывается. Проблема заключается в том, что два пользователя одновременно используют приложение и получают не тот файл (время между созданием файла и его загрузкой иногда может составлять 1 или 2 минуты). Я хочу избежать этой проблемы. Вот мой код и структура папок:
[*]
FlaskApp
модули
FileCreate.py Формы.py [*]шаблоны
InputPage.html [*]WebApp.py
WebApp.py:
из фляги импорта Flask, render_template, send_file, request из модулей импорта Forms, FileCreate приложение = Колба(__name__) @app.route("/index", методы = ["GET", "POST"]) защита vFileCreate(): форма = Формы.clInputFromUser() если form.validate_on_submit() и request.method == "POST": списокданных = form.stringdata.data пользовательские данные = FileCreate.clFileCreate (список данных, форма) пользовательские данные.file_save() return render_template("InputPage.html", form=form, userdata=userdata) еще: вернуть render_template("InputPage.html") если __name__ == '__main__': app.run(отладка=Истина) @app.route("/download_file") защита vDownloadFile(): ПУТЬ = "UserReport.txt" вернуть send_file(PATH, as_attachment=True, download_name="Sample_Report.txt") Forms.py:
из flask_wtf импорта FlaskForm класс clInputFromUser (FlaskForm): stringdata = TextAreaField("Вставьте сюда столбец данных:") submit = SubmitField("Анализ данных и создание файла") FileCreate.py:
класс clFileCreate: def __init__(self, listdata, form): self.formdata = форма self.data = formdata.stringdata.data fp = open('UserReport.txt', 'w') fp.write(self.data) fp.close() InputPage.html:
Страница формы {{ form.hidden_tag() }} {{ form.stringdata.label }}
{{ form.stringdata(size=32) }} {{ form.submit() }} Загрузить отчет Какие варианты я могу использовать, чтобы убедиться, что пользователю, который только что заполнил форму, был отправлен правильный файл? Из-за ограничений нет базы данных, нет заданий CRON на сервере по очистке файлов, нет идентификации пользователя.
Идея 1. Я мог бы перезапустить класс непосредственно перед загрузкой, но для этого необходимо повторно отправить форму, и я не знаю, как это сделать.
Идея 2: я мог бы передать файл в потоковом режиме, но не знаю, как переместить переменную потока в функцию загрузки в маршруте download_file, поскольку это две разные функции.
Идея 3: я мог бы идентифицировать сеанс (я не знаю, возможно ли это) и гарантировать, что пользователь получит правильный файл, сделав имя файла уникальным для сеанса, но тогда я этого не делаю. знать, как удалить файл после загрузки или передать уникальное имя файла в функцию download_file из класса. (см. ограничения).
Есть идеи?
ПРИМЕЧАНИЕ. Этот код представляет собой образец, демонстрирующий структуру. Я не проверял это, поскольку вопрос больше касается концепции подхода к проблеме, а не конкретного кода.
Мое приложение создает файл на сервере на основе ввода в WTForms. Имя файла никогда не меняется. Когда приходит новый пользователь, заполняет форму, и старый файл перезаписывается. Проблема заключается в том, что два пользователя одновременно используют приложение и получают не тот файл (время между созданием файла и его загрузкой иногда может составлять 1 или 2 минуты). Я хочу избежать этой проблемы. Вот мой код и структура папок:
[*]
FlaskApp
модули
FileCreate.py Формы.py [*]шаблоны
InputPage.html [*]WebApp.py
WebApp.py:
из фляги импорта Flask, render_template, send_file, request из модулей импорта Forms, FileCreate приложение = Колба(__name__) @app.route("/index", методы = ["GET", "POST"]) защита vFileCreate(): форма = Формы.clInputFromUser() если form.validate_on_submit() и request.method == "POST": списокданных = form.stringdata.data пользовательские данные = FileCreate.clFileCreate (список данных, форма) пользовательские данные.file_save() return render_template("InputPage.html", form=form, userdata=userdata) еще: вернуть render_template("InputPage.html") если __name__ == '__main__': app.run(отладка=Истина) @app.route("/download_file") защита vDownloadFile(): ПУТЬ = "UserReport.txt" вернуть send_file(PATH, as_attachment=True, download_name="Sample_Report.txt") Forms.py:
из flask_wtf импорта FlaskForm класс clInputFromUser (FlaskForm): stringdata = TextAreaField("Вставьте сюда столбец данных:") submit = SubmitField("Анализ данных и создание файла") FileCreate.py:
класс clFileCreate: def __init__(self, listdata, form): self.formdata = форма self.data = formdata.stringdata.data fp = open('UserReport.txt', 'w') fp.write(self.data) fp.close() InputPage.html:
Страница формы {{ form.hidden_tag() }} {{ form.stringdata.label }}
{{ form.stringdata(size=32) }} {{ form.submit() }} Загрузить отчет Какие варианты я могу использовать, чтобы убедиться, что пользователю, который только что заполнил форму, был отправлен правильный файл? Из-за ограничений нет базы данных, нет заданий CRON на сервере по очистке файлов, нет идентификации пользователя.
Идея 1. Я мог бы перезапустить класс непосредственно перед загрузкой, но для этого необходимо повторно отправить форму, и я не знаю, как это сделать.
Идея 2: я мог бы передать файл в потоковом режиме, но не знаю, как переместить переменную потока в функцию загрузки в маршруте download_file, поскольку это две разные функции.
Идея 3: я мог бы идентифицировать сеанс (я не знаю, возможно ли это) и гарантировать, что пользователь получит правильный файл, сделав имя файла уникальным для сеанса, но тогда я этого не делаю. знать, как удалить файл после загрузки или передать уникальное имя файла в функцию download_file из класса. (см. ограничения).
Есть идеи?
ПРИМЕЧАНИЕ. Этот код представляет собой образец, демонстрирующий структуру. Я не проверял это, поскольку вопрос больше касается концепции подхода к проблеме, а не конкретного кода.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Тестирование приложения Flask-Wtforms, которое использует токен CSRF (Pytest)
Anonymous » » в форуме Python - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Тестирование приложения Flask-Wtforms, которое использует токен CSRF (Pytest)
Anonymous » » в форуме Python - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-