Использовал глобальные переменные в приложении Flask, не осознавая, что это вызывает проблемы с размещенным приложением.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Использовал глобальные переменные в приложении Flask, не осознавая, что это вызывает проблемы с размещенным приложением.

Сообщение Anonymous »

Я новичок в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»