Я новичок в 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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Yocto устанавливает пользовательские переменные, глобальные переменные
Anonymous » » в форуме Python - 0 Ответы
- 30 Просмотры
-
Последнее сообщение Anonymous
-