Можно ли получить доступ к файлу рассола, сохраненному в каталоге в представлениях Django?

#python #django #pickle

Вопрос:

Позвольте мне объяснить, в чем моя проблема: чтобы не возиться с базой данных, я сохранил две модели машинного обучения в файле .pickle в папке в моем проекте Django. Затем в соответствующем views.py Я хочу открыть и использовать эту модель. Дело в том, что все это хорошо работает, когда я запускаю сервер локально, но после развертывания на heroku невозможно получить доступ к этим моделям, и сайт не работает.

У вас есть идея, можно ли использовать этот метод после развертывания или мне нужно сохранить их в базе данных

организация файлов проекта :

  main_folder >
       models_folder >
              saved_models_folder >
                     my_model.pickle (here the model that I want to open)

       app_folder >
              views.py  ( here is the file in which I try to open the .pickle model)
 

На самом деле у меня есть этот код, но он не может работать, потому что я не нахожусь в папке «Модели», когда пытаюсь ее открыть.

     def open_model(file_name):
        base_dir = 'models_folder\saved_models_folder'
        file_path = os.path.join(base_dir, file_name)
        if os.path.exists(file_path):
            print("Loading Trained Model")
            model = pickle.load(open(file_path, "rb"))

       else:
          print('No model with this name, check this and retry')
          model = None
       return model

 

Если у кого-то есть небольшая идея, я очень заинтересован.
Спасибо.

Ответ №1:

Конечно, это так, но, как вы заметили, вам нужно помнить о каталогах, в которых вы находитесь.

Современные настройки Django по умолчанию поставляются с BASE_DIR Path объектом, который вы можете использовать:

 from django.conf import settings

def open_model(file_name):
    models_folder = settings.BASE_DIR / 'models_folder' / 'saved_models_folder'
    file_path = os.path.join(models_folder, os.path.basename(file_name))
    # ...
 

Примечание. Я добавил os.path.basename() в wrap file_name , чтобы избежать атак обхода каталогов (например, кто-то, передающий ../../../secret_file имя файла).

Комментарии:

1. Спасибо за ваш ответ, я им воспользуюсь.