Проблема создания папки и файла после загрузки в Django
Я создаю платформу для оценки исходного кода, используя React и Django. В основном пользователь загружает выбранный им исходный файл, мой фронтенд отправляет файл в бэкенд, который работает нормально, и мой бэкенд должен создать копию файла в определенной структуре папок, потому что приложение code evaluater (другое приложение) должно обращаться к этой структуре в поисках новых файлов.
Структура папок в основном выглядит следующим образом: У меня есть первая папка с именем Delivereds, внутри нее есть много папок, названных по идентификатору пользователя, внутри каждой из этих папок есть много папок, названных по идентификатору отправки.
Для упрощения решения проблемы, давайте разберемся с этим, игнорируя идентификатор пользователя, просто сосредоточимся на адресе папки, как это: "/Delivereds/Question1/code.c++".
Моя проблема в том, что когда я пытаюсь создать папку, она не работает. Я практически новичок в Django, поэтому я не знаю, нужно ли мне устанавливать какие-то конфигурации в главном файле настроек. Решения, которые я нашел в своих поисках, очень просты и не сработали в моем случае.
Мой текущий код выглядит следующим образом:
elif request.method == 'POST':
if request.FILES.get('file'):
file = request.FILES['file']
parent_dir = '..\Delivereds\Question1'
path = os.path.join(parent_dir, file.name)
try:
if not os.path.exists(path):
print('hit')
os.mkdir(path)
else:
print('no hit')
except Exception as error:
print(error)
try:
with open(path, 'wb+') as destiny:
for chunk in file.chunks():
destiny.write(chunk)
print(chunk)
except Exception as error:
print(error)
Ниже print(chunk)
находится сериализатор и возврат. Я уже пробовал разные варианты этого кода, например, создать только папку с os.mkdir(path)
и использовать что-то вроде with open(path + file.name, 'wb+') as destiny
.
Этот файл - view.py приложения под названием tasks_delivered. Идея заключается в том, чтобы создать папку Delivereds в корне приложения Django и хранить в ней все задания (предложения о том, как сделать это более эффективно, приветствуются).
Я использую "hit" и "no hit" для отладки.
Оба блока try
возвращают ошибки, вывод такой:
hit
[WinError 3] [WinError 3] The system cannot find the path specified: '..\\Delivereds\\Question1\\test.cpp'
[Errno 2] No such file or directory: '..\\Delivereds\\Question1\\test.cpp'
Я думаю, что одна из важных частей информации заключается в том, что мое приложение также использует изображения, поэтому мне пришлось изменить некоторые настройки, связанные со статическими файлами в основных settings.py
и urls.py
.
settings.py:
STATIC_URL = 'static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
CKEDITOR_UPLOAD_PATH = "media/images"
CKEDITOR_CONFIGS = {
'default': {
'toolbar': 'Custom',
'toolbar_Custom': [
['Bold', 'Italic', 'Underline'],
['NumberedList', 'BulletedList'],
['Link', 'Unlink'],
['RemoveFormat'],
],
'width': '100%',
},
}
urls.py:
urlpatterns = [
path('admin/', admin.site.urls),
path('token/', TokenObtainPairView.as_view()),
path('token/refresh/', TokenRefreshView.as_view()),
path('api-auth/', include('rest_framework.urls')),
path('', include('user.urls')),
path('', include('disciplines.urls')),
path('', include('semesters.urls')),
path('', include('tasks.urls')),
path('', include('task_question.urls')),
path('', include('tasks_delivered.urls')),
path('', include('task_classgroups.urls')),
path('', include('classgroup.urls')),
path('', include('related_topic.urls')),
path('', include('tags.urls')),
path('', include('field_areas.urls')),
path('', include('question_historic.urls')),
path('', include('questions.urls')),
path('', include('strategy_correction.urls')),
path('', include('strategy_classgroup.urls')),
path('', include('strategy_discipline.urls')),
path('', include('strategy_question.urls')),
path('', include('strategy_task.urls')),
path('', include('help_tips.urls')),
path('', include('tips.urls')),
path('', include('admin_type.urls')),
path('', include('summaries.urls')),
path('ckeditor/', include('ckeditor_uploader.urls')),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Я не понимаю, почему у меня проблемы с указанными путями, я думал, что цель os.mkdir(path)
заключается в создании папки по указанному пути, если она еще не существует. Может ли кто-нибудь помочь мне исправить мой код и понять проблему?
Вместо этого можно использовать os.mkdir(path)
try, os.makedirs(path) создаст родительский каталог, если он не существует. Если промежуточные каталоги в пути не существуют, он создаст их.