У меня есть скрипт 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) Или сохранить файл? (Поскольку это статическая папка, решить проблему так, как я себе представлял, невозможно?)
Каким будет наиболее эффективный способ создать такое приложение?
Извините за плохой английский, я использую переводчик.
создайте общедоступный каталог вручную на сервере.
Никакой ошибки не выдает, файл просто не отображается. Проверьте сервер, размещенный по этой ссылке morning-gorge-14494.herokuapp.com/users Отображаемый файл был уже существующим, а не новым, который якобы был сгенерирован.
Как мне это сделать?
Если локально работает, а на сервере нет, проблема, скорее всего, в разнице в конфигурации между вашей локальной средой и сервером. Проверьте, является ли вывод console.info(${code});0
Я получаю код 1 для размещенного сервера и код 0 для местоположения. Означает ли это, что скрипт выполняется неправильно?
Именно так - 0 означает нормально, >0 означает ошибку. Можете ли вы поместить содержимое файла public/python/pdf.py в вопрос?
Код большой и очень плохо написан, но представление получить можно. github.com/Edubgr/Corretor.git
Можете ли вы запустить python3 public/python/pdf.py в оболочке сервера?
Я получаю это stderr: Traceback (последний последний вызов): файл «public/python/pdf.py», строка 1, в <module> from reportlab.pdfgen import canvas ModuleNotFoundError: нет модуля с именем «reportlab»



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете захватить поток ошибок из порожденного процесса следующим образом:
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»
Ошибка в том, что библиотека не существует на сервере. Как мне это исправить?
Как я могу это сделать? Я создал среду для python и установил библиотеку reportlab, но она все равно не работает. Я обновил репозиторий, пожалуйста, проверьте.
Теперь вам нужно использовать python из среды virt. Это может вам помочь: stackoverflow.com/questions/57875421/…
stderr: environments/my_env/bin/python3: /lib/x86_64-linux-gnu/libm.so.6: версия GLIBC_2.29 не найдена (требуется для environments/my_env/bin/python3) новая ошибка
Вы установили виртуальную среду на сервер или на локальную машину? Где вы вводите команды - локально или на сервере?
Установил на локальную машину но отправил папку на сервер.
Извините за невежество, я еще новичок.
К сожалению, это так не работает - вам нужен доступ к командной строке сервера, чтобы выполнять команды для создания virt env и установки там зависимостей.
Нп :) все равно хорошая попытка :) - нужен сервер с возможностью установки на него пакетов python - по другому не получится.
На самом деле могут быть некоторые обходные пути, о которых я не знаю, например: stackoverflow.com/questions/48746494/… - но смена сервера может оказаться проще.
Чтобы создать среду, мне нужно установить python-venv. Однако я не могу пройти через серверный терминал, мне искать другой хостинг?
Да, к сожалению.
Я понимаю, я буду работать над этим, теперь я лучше понимаю свою проблему. Большое вам спасибо :) Теперь последнее: является ли способ, которым файл сохраняется скриптом Python и читается узлом, пока он не будет отправлен на html-страницу, эффективен и функционален?
Кажется, все в порядке - до тех пор, пока вам нужно сохранить этот файл - если нет - вы можете просто «передать» содержимое pdf в nodejs, вернув его из скрипта python (например, в стандартный вывод) вместо сохранения на диск. В качестве альтернативы вам вообще не нужно передавать файл с помощью nodejs - просто сообщите своему интерфейсу js, что это сделано, и обслуживайте файл вашим статическим файловым сервером - точно так же, как изображение или css.
Пожалуйста, примите мой опубликованный ответ, если с вами все в порядке :)
Какую ошибку выдавал сервер при размещении? Пожалуйста, добавьте его в пост.