#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. Спасибо за ваш ответ, я им воспользуюсь.