Не удается запустить Python Flask с сервером Waitress, если он работает как служба Windows - PullRequest
0 голосов
/ 02 июня 2019

Я создал приложение Python с Flask и запускаю с сервером Waitress.

Приложение использует локальные файлы .csv в качестве входных данных.

Может хорошо работать при запуске из командной строки. (т.е. python webserver.py), я могу загрузить CSV для чтения данных, загрузить (перезаписать) CSV-файлы.

Но когда я добавляю его в качестве службы окна (с помощью nssm или Window Resource Kit), моё приложение может работать, но файлы csv могут загружаться только JS, а не python.

Это означает, что в сервисном режиме, если я загружаю csv с помощью js, это нормально, но при загрузке или загрузке файла (с использованием скрипта python) возвращается «Внутренняя ошибка сервера».

У меня вопрос: чем отличаются запуск командной строки и добавление в качестве службы Windows? Как сделать так, чтобы скрипт Python работал с CSV-файлом при создании его как сервиса?

Любая помощь приветствуется. Большое вам спасибо.

Это код загрузки.

@app.route('/uploadss', methods = ['GET', 'POST'])
def upload():
    import os
    print(request.files['file'])
    if request.method=='POST':
        file = request.files['file']
        filenames = ['temperature.csv','inlet_clean_info.csv','log_data.csv','medium-term-temperature.csv']
        if file.filename in filenames:
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], file.filename))
            return 'file uploaded successfully'
        else:
            return 'filename is not acceptable'

и я добавил официантский веб-сервер в качестве службы с:

> -(nssm) nssm.exe install MyService. Then add python path and the executed python file.
> -(Window ResKit) instsrv.exe LNG c:\reskit\srvany.exe. Then add "Parameter" key in Regedit, add "Application" String to point to <python path> <executed path>

В обоих случаях возвращается «Внутренняя ошибка сервера»

Это сообщение об ошибке, возвращенный ответ

"500 Внутренняя ошибка сервера

Внутренняя ошибка сервера

сервер обнаружил внутреннюю ошибку и не смог завершить запрос. Либо сервер перегружен, либо в приложение.

"

1 Ответ

0 голосов
/ 02 июня 2019

Основные различия при запуске приложения в качестве службы заключаются в среде.

Некоторые особенности, в частности:

Какой пользователь запускает службу как.
Когда вы запускаете его из командной строки, он, вероятно, работает как ваша учетная запись пользователя.Ваша учетная запись пользователя, скорее всего, будет иметь другие разрешения, чем системная учетная запись Windows.Это приводит к проблемам с доступом к файлам больше, чем, например, к открытию порта для HTTP-сервера.Могут быть и другие проблемы, связанные с разрешениями.

Переменные среды, включая PATH.
Когда вы находитесь в командной оболочке, в Windows есть переменная PATH, которая указывает, где искатьисполняемые файлы.Поэтому, если вы наберете python, он ищет python.exe в текущей папке, а затем ищет переменную PATH, пока не найдет python.exe

У вас также есть другие переменные окружения, которые можно определить, такие как TMP(временная папка) и т. д.

Когда он работает как служба, он обычно работает в другом пользовательском контексте, который будет иметь разные переменные среды, как% TMP%, так и PATH.Таким образом, одна вещь, которая могла бы произойти, это то, что она пытается запустить python.exe, но нет пути python.exe для пользователя службы.

Запись реестра HKCU
Если ваше приложение использует реестр и использует дерево HKEY_CURRENT_USER, оно, вероятно, отличается, когда оно работает как служба.(HKEY_CURRENT_MACHINE, вероятно, то же самое).

Папка, в которой запускается приложение
Когда вы запускаете его из командной строки, вы обычно запускаете его в текущей папке.Это означает, что можно использовать относительные пути (например, .\images) вместо абсолютных путей (c:\website\images).

Если вы перейдете в другую папку, версия .\images может не работать.

Когда программа запускается как служба, обычно она запускается в C:\Windows\System32

Таким образом, вы можете выяснить, работает ли использование абсолютных путей.Или вы можете выяснить, существует ли способ указать папку для запуска.

Еще одна вещь, которую нужно проверить (возможно, сначала) - найдите файл журнала

Обычно веб-серверы пишутфайл журнала на сервере где-то.

Ошибка 500 будет отправлена ​​пользователю, но в журнал будет записана более подробная ошибка.Так что найдите, где должен быть этот лог-файл, и проверьте его.(Возможно, это не там, где должно быть, и это может быть связано с разрешениями, связанными с пользователем, от имени которого работает служба).Если это так, это может помочь отследить конкретную проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...