Отображать на веб-странице PDF, сгенерированный в python с помощью nodejs

У меня есть скрипт Python, который создает файл PDF в соответствии с предоставленной информацией. Я создал приложение в nodejs, чтобы при каждом запросе POST скрипт выполнялся, создавая новый файл PDF. Файл сохраняется в «общедоступной» папке, и в ответ запрос возвращает этот PDF-файл. Этот файл отображается на HTML-странице, где можно указать необходимую информацию для создания PDF-файла.

УЗЕЛ JS

router.post('/', (req, res) => {
    var data = req.body;
    console.info(data)
    const python = spawn('python3', ['public/python/pdf.py', data.nSchool, data.nSubject, data.nProf, data.nQue]);

    python.on('close', (code) => {
         console.info(`${code}`);

        var file = fs.createReadStream("./public/pdf/gab.pdf");
        res.contentType('application/pdf')
        file.pipe(res);
    });
});

ЯВАСКРИПТ

document.querySelector('#submit').onclick = function(){
    fetch('/makepdf', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            nSchool: document.querySelector('#nSchool').value,
            nSubject: document.querySelector('#nSubject').value,
            nProf: document.querySelector('#nProf').value,
            nQue: document.querySelector('#nQue').value
        })
    }).then(function(res) {
        res.blob().then(function(resq){
            var fileURL = URL.createObjectURL(resq)
            document.querySelector('#img').src = fileURL
        });
    });
}

Приложение отлично работает, когда оно работает локально, но когда оно размещено, файл PDF не применяется.

В чем проблема? При генерации файла? (Возможно, на сервере неправильно работает скрипт python) Или сохранить файл? (Поскольку это статическая папка, решить проблему так, как я себе представлял, невозможно?)

Каким будет наиболее эффективный способ создать такое приложение?

Извините за плохой английский, я использую переводчик.

Какую ошибку выдавал сервер при размещении? Пожалуйста, добавьте его в пост.

Akihito KIRISAKI 26.12.2020 14:49

создайте общедоступный каталог вручную на сервере.

Ahmed Magdy 26.12.2020 14:54

Никакой ошибки не выдает, файл просто не отображается. Проверьте сервер, размещенный по этой ссылке morning-gorge-14494.herokuapp.com/users Отображаемый файл был уже существующим, а не новым, который якобы был сгенерирован.

Edubgr 26.12.2020 14:56

Как мне это сделать?

Edubgr 26.12.2020 14:58

Если локально работает, а на сервере нет, проблема, скорее всего, в разнице в конфигурации между вашей локальной средой и сервером. Проверьте, является ли вывод console.info(${code});0

Beniamin H 26.12.2020 15:04

Я получаю код 1 для размещенного сервера и код 0 для местоположения. Означает ли это, что скрипт выполняется неправильно?

Edubgr 26.12.2020 15:19

Именно так - 0 означает нормально, >0 означает ошибку. Можете ли вы поместить содержимое файла public/python/pdf.py в вопрос?

Beniamin H 26.12.2020 15:47

Код большой и очень плохо написан, но представление получить можно. github.com/Edubgr/Corretor.git

Edubgr 26.12.2020 17:05

Можете ли вы запустить python3 public/python/pdf.py в оболочке сервера?

Beniamin H 26.12.2020 17:44

Я получаю это stderr: Traceback (последний последний вызов): файл «public/python/pdf.py», строка 1, в <module> from reportlab.pdfgen import canvas ModuleNotFoundError: нет модуля с именем «reportlab»

Edubgr 26.12.2020 18:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
10
165
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете захватить поток ошибок из порожденного процесса следующим образом:

python.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

Это должно сказать вам, почему выполнение скрипта Python не выполняется.

Кстати. вам следует переместить файл python из каталога public/, так как это делает его излишне общедоступным.

2020-12-26T17:40:04.904938+00:00 приложение[web.1]: stderr: Traceback (последний последний вызов): 2020-12-26T17:40:04.904941+00:00 приложение[web.1]: Файл «public/python/pdf.py», строка 1, в <module> 2020-12-26T17:40:04.904941+00:00 app[web.1]: from reportlab.pdfgen import canvas 2020-12-26T17: 40:04.904942+00:00 приложение [web.1]: ModuleNotFoundError: нет модуля с именем «reportlab»

Edubgr 26.12.2020 18:41

Ошибка в том, что библиотека не существует на сервере. Как мне это исправить?

Edubgr 26.12.2020 18:42
pypi.org/project/reportlab - но вам нужен доступ для установки на сервер (например, доступ к командной строке + виртуальная среда).
Beniamin H 26.12.2020 18:45

Как я могу это сделать? Я создал среду для python и установил библиотеку reportlab, но она все равно не работает. Я обновил репозиторий, пожалуйста, проверьте.

Edubgr 26.12.2020 19:08

Теперь вам нужно использовать python из среды virt. Это может вам помочь: stackoverflow.com/questions/57875421/…

Beniamin H 26.12.2020 19:14

stderr: environments/my_env/bin/python3: /lib/x86_64-linux-gnu/libm.so.6: версия GLIBC_2.29 не найдена (требуется для environments/my_env/bin/python3) новая ошибка

Edubgr 26.12.2020 19:38

Вы установили виртуальную среду на сервер или на локальную машину? Где вы вводите команды - локально или на сервере?

Beniamin H 26.12.2020 19:44

Установил на локальную машину но отправил папку на сервер.

Edubgr 26.12.2020 19:47

Извините за невежество, я еще новичок.

Edubgr 26.12.2020 19:49

К сожалению, это так не работает - вам нужен доступ к командной строке сервера, чтобы выполнять команды для создания virt env и установки там зависимостей.

Beniamin H 26.12.2020 19:49

Нп :) все равно хорошая попытка :) - нужен сервер с возможностью установки на него пакетов python - по другому не получится.

Beniamin H 26.12.2020 19:51

На самом деле могут быть некоторые обходные пути, о которых я не знаю, например: stackoverflow.com/questions/48746494/… - но смена сервера может оказаться проще.

Beniamin H 26.12.2020 19:56

Чтобы создать среду, мне нужно установить python-venv. Однако я не могу пройти через серверный терминал, мне искать другой хостинг?

Edubgr 26.12.2020 20:06

Да, к сожалению.

Beniamin H 26.12.2020 20:10

Я понимаю, я буду работать над этим, теперь я лучше понимаю свою проблему. Большое вам спасибо :) Теперь последнее: является ли способ, которым файл сохраняется скриптом Python и читается узлом, пока он не будет отправлен на html-страницу, эффективен и функционален?

Edubgr 26.12.2020 20:17

Кажется, все в порядке - до тех пор, пока вам нужно сохранить этот файл - если нет - вы можете просто «передать» содержимое pdf в nodejs, вернув его из скрипта python (например, в стандартный вывод) вместо сохранения на диск. В качестве альтернативы вам вообще не нужно передавать файл с помощью nodejs - просто сообщите своему интерфейсу js, что это сделано, и обслуживайте файл вашим статическим файловым сервером - точно так же, как изображение или css.

Beniamin H 26.12.2020 20:27

Пожалуйста, примите мой опубликованный ответ, если с вами все в порядке :)

Beniamin H 26.12.2020 20:46

Другие вопросы по теме