«[Errno 13] В доступе отказано» При попытке обновить / изменить документ только на сервере Ubuntu - PullRequest
0 голосов
/ 12 июня 2019

При изменении / обновлении информации в бэкенде Admin приложения Django, я столкнулся с ошибкой разрешения.

Несколько вещей на заметку: -Это только происходит, когда я пытаюсь загрузить документ или изменить запись с документом в нем. - Добавление / редактирование записей базы данных без прикрепленных к ним файлов - это хорошо! -На моей локальной версии все отлично работает.

Следующий логический шаг для меня - проверить права доступа к файлам / папкам, поэтому я изменил все на своем тестовом сервере 'lrwxrwxrwx', включая папку для выгрузки, всю среду Python3.5 (я перешел обратно после того, как это не решило, я знаю, довольно рискованно оставлять его при любых разрешениях).

[Errno 13] Permission denied
Request Method: POST
Request URL:    https://admin/inhouse/document/1704/change/
Django Version: 1.11
Exception Type: PermissionError
Exception Value:    
[Errno 13] Permission denied
Exception Location: /usr/lib/python3.5/subprocess.py in _execute_child, line 1551
Python Executable:  /home/ubuntu/.virtualenv/bin/python
Python Version: 3.5.2
Python Path:    
['/home/ubuntu/.virtualenv/lib/python35.zip',
 '/home/ubuntu/.virtualenv/lib/python3.5',
 '/home/ubuntu/.virtualenv/lib/python3.5/plat-x86_64-linux-gnu',
 '/home/ubuntu/.virtualenv/lib/python3.5/lib-dynload',
 '/usr/lib/python3.5',
 '/usr/lib/python3.5/plat-x86_64-linux-gnu',
 '/home/ubuntu/.virtualenv/lib/python3.5/site-packages',
 '/home/ubuntu/foodlegal/foodlegal-repo',
 '/home/ubuntu/foodlegal',
 '/home/ubuntu/.virtualenv/lib/python3.5/site-packages/IPython/extensions']

И эта функция вызывает всю эту проблему

@receiver(post_save, sender=Document)
def convert_pdf_upload(sender, instance, **kwargs):

    if not instance.document_file:
        return

    current_path = settings.BASE_DIR+'/foodlegal/'+instance.document_file.url
    pdf_path = settings.BASE_DIR+'/foodlegal/uploads/documents/'+str(instance.id)+'.pdf'
    swf_path = settings.BASE_DIR+'/foodlegal/uploads/documents/'+str(instance.id)+'.swf'
    txt_path = settings.BASE_DIR+'/foodlegal/uploads/documents/'+str(instance.id)+'.txt'

    pdf2swf_path = settings.BASE_DIR+'/foodlegal/tools/pdf2swf'
    pdftotext_path = settings.BASE_DIR+'/foodlegal/tools/pdftotext'

    try:
        os.rename(current_path, pdf_path)
    except OSError:
        pass
    subprocess.call([pdf2swf_path, pdf_path, '-o', swf_path, '-f', '-T', '9', '-t', '-s',
                    'storeallcharacters'])

    subprocess.call([pdftotext_path, pdf_path])
    txt = codecs.open(txt_path, "r", encoding='utf-8', errors='ignore')
    file_txt = txt.read()
    instance.file_text = re.sub('[^A-Za-z0-9 ]+', ' ', file_txt)

    if instance.content_type in [1, 2]:
        instance.file_text = re.sub('[^A-Za-z0-9 ]+', ' ', instance.document_content)

    post_save.disconnect(convert_pdf_upload, sender=Document)
    instance.save()
    post_save.connect(convert_pdf_upload, sender=Document)

Версия сервера: Apache / 2.4.18 (Ubuntu) Идентификатор распространителя: Ubuntu Описание: Ubuntu 16.04.2 LTS Релиз: 16.04 Кодовое имя: xenial

Попытка изменения разрешений через chmod 777 для папок, включая Python3.5, всего приложения InHouse Django и загрузки папки, была неудачной.

Вполне может быть, что-то вроде разрешения chmod fix, но какую папку я пропустил?

Вот как выглядят вызовы трассировки

1 Ответ

1 голос
/ 12 июня 2019

Вам нужно сделать сценарии в /foodlegal/tools исполняемыми для взаимодействия с ними через subprocess.call, как это. Находясь в этом каталоге:

chmod +x pdf2swf
chmod +x pdftotext

(есть ли на них .sh?)

Дальнейшее чтение: Невозможно выполнить сценарий оболочки из подпроцесса python: разрешение отклонено

...