TypeError: ожидаемый объект str, bytes или os.PathLike, а не метод - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь загрузить файл, загруженный из формы HTML через POST, на Google Диск. Мне удалось получить имя файла, временный путь к файлу, но это вызывает эту ошибку, и файл в конечном итоге не загружается на Google Диск.

@method_decorator(csrf_exempt, name='dispatch')
class Submit(MissionSubmission):
    def get(self, request, mission_id):
        mission = MissionDetail.objects.all().filter(id=mission_id)[0]
        mission = newline_aware(mission)

        return render(request, 'home/submit.html', {'mission': mission})

    def post(self, request, mission_id):
        request.upload_handlers = [TemporaryFileUploadHandler(request=request)]
        return self._post(request, mission_id)

    @method_decorator(csrf_protect)
    def _post(self, request, mission_id):
        uploaded_file = request.FILES['filename']
        print(uploaded_file.name)
        print(uploaded_file.size)
        print(uploaded_file.temporary_file_path())
        print(uploaded_file.content_type)

        file_metadata = {'name': uploaded_file.name}
        media = MediaFileUpload(uploaded_file.temporary_file_path,
                                mimetype=uploaded_file.content_type)
        file = drive.files().create(body=file_metadata,
                                            media_body=media,
                                            fields='id').execute()
        print('File ID: %s' % file.get('id'))

        return HttpResponse("Hi")

Кто-нибудь знает, что не так? Это то, что я получаю из консоли.

(venv) marcus@marcus-RAVEN-SE:/mnt/d/Programming/UnlockProject/System/unlock$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
May 08, 2020 - 17:44:18
Django version 3.0.5, using settings 'unlock.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[08/May/2020 17:44:22] "GET / HTTP/1.1" 200 8283
[08/May/2020 17:44:22] "GET /static/js/bootstrap.js HTTP/1.1" 200 135079
[08/May/2020 17:44:22] "GET /static/css/bootstrap.min.css HTTP/1.1" 200 196315
[08/May/2020 17:44:22] "GET /static/images/CYCLogo.png HTTP/1.1" 304 0
[08/May/2020 17:44:22] "GET /static/images/TitleLogo.png HTTP/1.1" 200 110175
[08/May/2020 17:44:22] "GET /static/images/unlockBG.jpg HTTP/1.1" 200 649451
[08/May/2020 17:44:26] "GET /mission/ HTTP/1.1" 200 6334
[08/May/2020 17:44:26] "GET /static/images/Lock.png HTTP/1.1" 304 0
[08/May/2020 17:44:27] "GET /mission/submit/1 HTTP/1.1" 200 4496
Login.png
258917
/tmp/tmpnpz7epou.upload.png
image/png
Internal Server Error: /mission/submit/1
Traceback (most recent call last):
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/django/utils/decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/django/utils/decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "/mnt/d/Programming/UnlockProject/System/unlock/home/views.py", line 116, in post
    return self._post(request, mission_id)
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/django/utils/decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/mnt/d/Programming/UnlockProject/System/unlock/home/views.py", line 127, in _post
    media = MediaFileUpload(uploaded_file.temporary_file_path,
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/googleapiclient/_helpers.py", line 134, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/mnt/d/Programming/UnlockProject/System/venv/lib/python3.8/site-packages/googleapiclient/http.py", line 575, in __init__
    fd = open(self._filename, "rb")
TypeError: expected str, bytes or os.PathLike object, not method
[08/May/2020 17:44:33] "POST /mission/submit/1 HTTP/1.1" 500 130268
Not Found: /favicon.ico
[08/May/2020 17:44:34] "GET /favicon.ico HTTP/1.1" 404 2844

Поскольку я могу получить подробную информацию о uploaded_file, я думаю, что часть кода django не имеет проблем, но это часть Google кода, вызывающего эту ошибку. Но это действительно оставило меня в затруднительном положении, я понятия не имел, что с этим не так, все кажется правильным, как и в документации Google.

Обновление: я попытался заменить переменную фактическим путем к реальному файлу, оно работает. Итак ... возможно ли, что uploaded_file. Contemporary_file_path (), предоставленная Django, недействительна?

1 Ответ

0 голосов
/ 08 мая 2020

Хорошо, глядя на ваш код, и сообщение об ошибке ясно для меня, что вы фактически передаете функцию (вызываемый объект) temporary_file_path вместо return этой функции.

Обычно

temporary_file_path != temporary_file_path()

Один (первый) - это объект функции, а другой - фактический путь к файлу.

Измените свой код на этот, и все будет хорошо:

media = MediaFileUpload(uploaded_file.temporary_file_path(),
                                mimetype=uploaded_file.content_type)
...