Почему я не могу открыть дважды django-uploded-файл? - PullRequest
0 голосов
/ 28 марта 2019

Я хотел бы открыть загруженный файл в валидаторе, чтобы убедиться, что файл в порядке, а затем снова откройте его в функции просмотра для извлечения данных.

Я не уверенесли это должно быть сделано так.Скажите мне, что вы думаете.

Вот мой валидатор в его простом состоянии:

def validate_file(value):
    with value.open("r") as sf:
        pass  # do some checks with the data
    # now the file is closed 

, и это моя функция просмотра:

def home(request):
    if request.method == 'POST':
        # create 2 form
        form_message = Filtre_message_form(request.POST)
        form_spatial = Filtre_spatial_form(request.POST, request.FILES)

        if all((form_message.is_valid(), form_spatial.is_valid())):
            # if the file is good open it
            f = request.FILES['file'].open(mode='r')
            # do some stuf with it

    else:
        # create 2 empty form
        form_message = Filtre_message_form()
        form_spatial = Filtre_spatial_form()
    return render(request, 'home.html', locals())

И я получаю этоошибка ValueError: I/O operation on closed file.

Вот стек ошибок:

Traceback (most recent call last):
  File "H:\workspace\test_Django\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "H:\workspace\test_Django\venv\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "H:\workspace\test_Django\venv\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "H:\workspace\test_Django\django_test\app_test\views.py", line 16, in home
    f = request.FILES['file'].open(mode='r')
  File "H:\workspace\test_Django\venv\lib\site-packages\django\core\files\uploadedfile.py", line 87, in open
    self.file.seek(0)
ValueError: I/O operation on closed file.

Я пробовал это:

def validate_file(value):
   sf = value.open("r")
   # this dosen't close the file 

и это работает, но на самом деле я использую это lib для чтения и анализа данных.Таким образом, используя lib, валидатор выглядит следующим образом:

def validate_file(value):
    import shapefile
    sf = shapefile.Reader(shp=value)

, и это не работает, вот стек ошибок:

Internal Server Error: /accueil/
Traceback (most recent call last):
  File "H:\workspace\test_Django\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "H:\workspace\test_Django\venv\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "H:\workspace\test_Django\venv\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "H:\workspace\test_Django\django_test\app_test\views.py", line 16, in home
    f = request.FILES['file'].open(mode='r')
  File "H:\workspace\test_Django\venv\lib\site-packages\django\core\files\uploadedfile.py", line 87, in open
    self.file.seek(0)
ValueError: I/O operation on closed file.

Я не понимаю, почему я могу 'открыть файл во второй раз?Библиотека, очевидно, закрывает файл, так почему я не могу открыть его во второй раз?

Можете ли вы помочь мне, пожалуйста?

...