Я новичок в Python и Flask, и это мое первое приложение. Цель приложения — считывать файлы из корзин S3 и объединять данные в сетку. Это простое веб-приложение, не требующее функции базы данных. Все, что пользователю нужно будет сделать, это просмотреть данные в координатной сетке, загрузить изображение и загрузить соответствующие файлы. В настоящее время все это работает, когда я запускаю код локально.
Проблема в том, что когда я создавал приложение, мне нужно было использовать переменные по всему серверному коду, поэтому я использовал глобальные переменные. Недавно я обнаружил, что это крайне плохая практика и по сути сделает мою программу непригодной для использования, если у нее будет несколько конечных пользователей. Мне интересно, есть ли способ решить мою проблему без полной переработки всей программы? Я рассмотрел использование «g» и «сессии». Если я правильно понимаю (а вполне возможно, что нет), «g» будет сбрасываться каждый раз, когда сервер получает доступ из внешнего интерфейса, что происходит каждые 2 секунды. Очевидно, это было бы плохо, учитывая, что результаты в настоящее время хранятся локально и не должны сбрасываться каждый раз при опросе сервера. Однако конечная точка, к которой осуществляется постоянное попадание, — это «get_progress», поэтому я не уверен, действительно ли это очистит данные или нет. Я определенно не прошу просто исправить мой код, но если у кого-нибудь есть какие-либо указатели, я буду очень признателен.
Я также использовал многопоточность, которая, по моему мнению, имеет ту же проблему. В настоящее время я ищу сельдерей, чтобы обойти эту проблему, поскольку использование потоков значительно сокращает время выполнения.
Вот код сервера:
PS: я знаю, что здесь, вероятно, много плохих практик, но сейчас я действительно сосредоточен на решении этой конкретной проблемы, поэтому буду очень признателен за любую помощь. Я также удалил большую часть кода, чтобы не перегружать пост.
app = Flask(__name__)
# Global variables for results and progress
results = []
progress = {"total_files": 0, "files_processed": 0}
def process_files(data):
"""Background function to process files."""
global results, progress
bucket_name = "noaa-jpss"
prefix = f"NOAA20/SOUNDINGS/NOAA20_NUCAPS-CCR/{data['year']}/{str(data['month']).zfill(2)}/{str(data['day']).zfill(2)}/"
client_s3 = boto3.client("s3", config=Config(signature_version=UNSIGNED))
file_keys = list_all_files(bucket_name, prefix, client_s3)
if not file_keys:
progress["status"] = "no_files"
progress["running"] = False
return
progress["status"] = "in_progress"
progress["total_files"] = len(file_keys)
progress["files_processed"] = 0
progress["stop_requested"] = False
for key in file_keys:
if progress["stop_requested"]: # Check if stop is requested
progress["status"] = "stopped"
progress["running"] = False
return
dataset = open_s3_dataset(bucket_name, key, client_s3)
filtered = filter_data(dataset, lat_min=data['lat_min'], lat_max=data['lat_max'], long_min=data['long_min'], long_max=data['long_max'])
if filtered:
if not any(result["file"] == key for result in results): # Avoid duplicates
results.append({"file": key, **filtered})
progress["files_processed"] += 1
progress["status"] = "completed"
progress["running"] = False
@app.route("/")
def index():
"""Render the main page."""
return render_template("index.html")
@app.route("/start_query", methods=["POST"])
def start_query():
"""Start processing files."""
global results, progress
# Check if a process is already running
if progress.get("running", False):
return jsonify({"message": "Processing is already running. Please wait for it to complete."}), 400
# Reset progress and results for a new query
results.clear()
progress = {"total_files": 0, "files_processed": 0, "status": "not_started", "running": True, "found_file": False, "bucket": None}
data = request.json
progress["bucket"] = data["Datasets"]
if(data['Datasets']=='aresol_depth'):
thread = threading.Thread(target=find_aresol_file, args=(data,))
thread.start()
print('looking for aresol data')
elif(data['Datasets']=='cris_radiances'):
# Start the file processing in a separate thread
thread = threading.Thread(target=process_files, args=(data,))
thread.start()
return jsonify({"message": "Processing started"})
@app.route("/stop_query", methods=["POST"])
def stop_query():
"""Stop the current query without clearing results."""
global progress
if progress.get("running", False):
progress["stop_requested"] = True # Signal to stop processing
progress["status"] = "stopped" # Update the status
progress["found_file"] == False
return jsonify({"message": "Query stopping..."}), 200
else:
return jsonify({"message": "No query is currently running."}), 400
@app.route("/get_progress", methods=["GET"])
def get_progress():
"""Get the current progress and results."""
return jsonify({"progress": progress, "results": results})
if __name__ == "__main__":
app.run(port=8000, debug=True)
Подробнее здесь: https://stackoverflow.com/questions/793 ... blems-with
Использовал глобальные переменные в приложении Flask, не осознавая, что это вызывает проблемы с размещенным приложением. ⇐ Python
Программы на Python
1737089106
Anonymous
Я новичок в Python и Flask, и это мое первое приложение. Цель приложения — считывать файлы из корзин S3 и объединять данные в сетку. Это простое веб-приложение, не требующее функции базы данных. Все, что пользователю нужно будет сделать, это просмотреть данные в координатной сетке, загрузить изображение и загрузить соответствующие файлы. В настоящее время все это работает, когда я запускаю код локально.
Проблема в том, что когда я создавал приложение, мне нужно было использовать переменные по всему серверному коду, поэтому я использовал глобальные переменные. Недавно я обнаружил, что это крайне плохая практика и по сути сделает мою программу непригодной для использования, если у нее будет несколько конечных пользователей. Мне интересно, есть ли способ решить мою проблему без полной переработки всей программы? Я рассмотрел использование «g» и «сессии». Если я правильно понимаю (а вполне возможно, что нет), «g» будет сбрасываться каждый раз, когда сервер получает доступ из внешнего интерфейса, что происходит каждые 2 секунды. Очевидно, это было бы плохо, учитывая, что результаты в настоящее время хранятся локально и не должны сбрасываться каждый раз при опросе сервера. Однако конечная точка, к которой осуществляется постоянное попадание, — это «get_progress», поэтому я не уверен, действительно ли это очистит данные или нет. Я определенно не прошу просто исправить мой код, но если у кого-нибудь есть какие-либо указатели, я буду очень признателен.
Я также использовал многопоточность, которая, по моему мнению, имеет ту же проблему. В настоящее время я ищу сельдерей, чтобы обойти эту проблему, поскольку использование потоков значительно сокращает время выполнения.
[b]Вот код сервера:[/b]
PS: я знаю, что здесь, вероятно, много плохих практик, но сейчас я действительно сосредоточен на решении этой конкретной проблемы, поэтому буду очень признателен за любую помощь. Я также удалил большую часть кода, чтобы не перегружать пост.
app = Flask(__name__)
# Global variables for results and progress
results = []
progress = {"total_files": 0, "files_processed": 0}
def process_files(data):
"""Background function to process files."""
global results, progress
bucket_name = "noaa-jpss"
prefix = f"NOAA20/SOUNDINGS/NOAA20_NUCAPS-CCR/{data['year']}/{str(data['month']).zfill(2)}/{str(data['day']).zfill(2)}/"
client_s3 = boto3.client("s3", config=Config(signature_version=UNSIGNED))
file_keys = list_all_files(bucket_name, prefix, client_s3)
if not file_keys:
progress["status"] = "no_files"
progress["running"] = False
return
progress["status"] = "in_progress"
progress["total_files"] = len(file_keys)
progress["files_processed"] = 0
progress["stop_requested"] = False
for key in file_keys:
if progress["stop_requested"]: # Check if stop is requested
progress["status"] = "stopped"
progress["running"] = False
return
dataset = open_s3_dataset(bucket_name, key, client_s3)
filtered = filter_data(dataset, lat_min=data['lat_min'], lat_max=data['lat_max'], long_min=data['long_min'], long_max=data['long_max'])
if filtered:
if not any(result["file"] == key for result in results): # Avoid duplicates
results.append({"file": key, **filtered})
progress["files_processed"] += 1
progress["status"] = "completed"
progress["running"] = False
@app.route("/")
def index():
"""Render the main page."""
return render_template("index.html")
@app.route("/start_query", methods=["POST"])
def start_query():
"""Start processing files."""
global results, progress
# Check if a process is already running
if progress.get("running", False):
return jsonify({"message": "Processing is already running. Please wait for it to complete."}), 400
# Reset progress and results for a new query
results.clear()
progress = {"total_files": 0, "files_processed": 0, "status": "not_started", "running": True, "found_file": False, "bucket": None}
data = request.json
progress["bucket"] = data["Datasets"]
if(data['Datasets']=='aresol_depth'):
thread = threading.Thread(target=find_aresol_file, args=(data,))
thread.start()
print('looking for aresol data')
elif(data['Datasets']=='cris_radiances'):
# Start the file processing in a separate thread
thread = threading.Thread(target=process_files, args=(data,))
thread.start()
return jsonify({"message": "Processing started"})
@app.route("/stop_query", methods=["POST"])
def stop_query():
"""Stop the current query without clearing results."""
global progress
if progress.get("running", False):
progress["stop_requested"] = True # Signal to stop processing
progress["status"] = "stopped" # Update the status
progress["found_file"] == False
return jsonify({"message": "Query stopping..."}), 200
else:
return jsonify({"message": "No query is currently running."}), 400
@app.route("/get_progress", methods=["GET"])
def get_progress():
"""Get the current progress and results."""
return jsonify({"progress": progress, "results": results})
if __name__ == "__main__":
app.run(port=8000, debug=True)
Подробнее здесь: [url]https://stackoverflow.com/questions/79363622/used-global-variables-in-a-flask-app-without-realizing-that-causes-problems-with[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия