Python 带有 Waitress 服务器的 Flask 不能 运行,当它成为 Windows 服务时
Python Flask with Waitress server cannot run, when making it as a Windows service
我用 Flask 构建了一个 Python 应用程序,用 Waitress 服务器构建了 运行 应用程序。
该应用程序使用本地 .csv 文件作为输入数据。
通过命令行运行宁运行可以很好的运行。 (即 python webserver.py),我可以加载 csv 来读取数据,上传(覆盖)csv 文件。
但是当我将其添加为 window 的服务(使用 nssm 或 Window 资源工具包)时,我的应用程序可以 运行,但 csv 文件只能是由 JS 加载,而不是 python。
也就是说,在服务模式下,如果我使用js加载csv,没问题,但是当加载或上传文件时(使用python脚本)它returns "Internal Server Error".
我的问题是,通过命令行 运行ning 和添加为 Window 的服务有何不同?如何使 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>
在这两种情况下,它 returns "Internal Server Error"
这是错误信息,返回的响应
" 500
Internal Server Error
Internal Server Error
The
server encountered an internal error and was unable to complete your
request. Either the server is overloaded or there is an error in the
application.
"
将应用程序作为服务运行时的主要区别在于环境。
一些具体的事情:
服务是运行哪个用户。
当您从命令行启动它时,它可能 运行ning 作为您的用户帐户。您的用户帐户可能拥有与 Windows 系统帐户不同的权限。这往往会导致访问文件的问题多于例如为 HTTP 服务器打开端口。可能还有其他与权限相关的问题。
环境变量,包括PATH。
当您在命令 shell 中时,windows 有一个 PATH 变量告诉它在哪里寻找可执行文件。因此,如果您键入 python
,它会在当前文件夹中查找 python.exe
,然后它会搜索 PATH 变量,直到找到 python.exe
你还有其他可以定义的环境变量比如TMP(临时文件夹)等
当它运行作为服务运行时,它通常运行在不同的用户上下文中运行,这将具有不同的环境变量,包括 %TMP% 和 PATH。因此,可能发生的一件事是它正在尝试 运行 python.exe
但服务用户的路径上没有 python.exe
。
HKCU 注册表项
如果您的应用程序使用注册表,并使用 HKEY_CURRENT_USER 树,则当它 运行ning 作为服务时,这可能会有所不同。 (HKEY_CURRENT_MACHINE 可能相同)。
应用程序启动的文件夹
当您从命令行 运行 它时,通常会在当前文件夹中启动它。这意味着可以使用相对路径(例如 .\images
)而不是绝对路径(c:\website\images
)。
如果您要更改到其他文件夹,则 .\images
版本可能无法使用。
当程序 运行 作为服务时,它通常似乎在 C:\Windows\System32
中启动
因此您可以调查使用绝对路径是否有效。或者您可以调查是否有指定启动文件夹的方法。
另一件要检查的事情(可能首先)- 查找日志文件
通常 Web 服务器会在服务器的某处写入一个日志文件。
用户会收到 500 错误,但会在日志中写入更详细的错误。所以找到那个日志文件应该在哪里并检查它。 (它可能不在应有的位置,这可能与与用户关联的权限有关,该服务是 运行ning as)。如果它存在,它可能有助于追踪特定问题。
我用 Flask 构建了一个 Python 应用程序,用 Waitress 服务器构建了 运行 应用程序。
该应用程序使用本地 .csv 文件作为输入数据。
通过命令行运行宁运行可以很好的运行。 (即 python webserver.py),我可以加载 csv 来读取数据,上传(覆盖)csv 文件。
但是当我将其添加为 window 的服务(使用 nssm 或 Window 资源工具包)时,我的应用程序可以 运行,但 csv 文件只能是由 JS 加载,而不是 python。
也就是说,在服务模式下,如果我使用js加载csv,没问题,但是当加载或上传文件时(使用python脚本)它returns "Internal Server Error".
我的问题是,通过命令行 运行ning 和添加为 Window 的服务有何不同?如何使 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>
在这两种情况下,它 returns "Internal Server Error"
这是错误信息,返回的响应
" 500 Internal Server Error
Internal Server Error
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
"
将应用程序作为服务运行时的主要区别在于环境。
一些具体的事情:
服务是运行哪个用户。
当您从命令行启动它时,它可能 运行ning 作为您的用户帐户。您的用户帐户可能拥有与 Windows 系统帐户不同的权限。这往往会导致访问文件的问题多于例如为 HTTP 服务器打开端口。可能还有其他与权限相关的问题。
环境变量,包括PATH。
当您在命令 shell 中时,windows 有一个 PATH 变量告诉它在哪里寻找可执行文件。因此,如果您键入 python
,它会在当前文件夹中查找 python.exe
,然后它会搜索 PATH 变量,直到找到 python.exe
你还有其他可以定义的环境变量比如TMP(临时文件夹)等
当它运行作为服务运行时,它通常运行在不同的用户上下文中运行,这将具有不同的环境变量,包括 %TMP% 和 PATH。因此,可能发生的一件事是它正在尝试 运行 python.exe
但服务用户的路径上没有 python.exe
。
HKCU 注册表项
如果您的应用程序使用注册表,并使用 HKEY_CURRENT_USER 树,则当它 运行ning 作为服务时,这可能会有所不同。 (HKEY_CURRENT_MACHINE 可能相同)。
应用程序启动的文件夹
当您从命令行 运行 它时,通常会在当前文件夹中启动它。这意味着可以使用相对路径(例如 .\images
)而不是绝对路径(c:\website\images
)。
如果您要更改到其他文件夹,则 .\images
版本可能无法使用。
当程序 运行 作为服务时,它通常似乎在 C:\Windows\System32
因此您可以调查使用绝对路径是否有效。或者您可以调查是否有指定启动文件夹的方法。
另一件要检查的事情(可能首先)- 查找日志文件
通常 Web 服务器会在服务器的某处写入一个日志文件。
用户会收到 500 错误,但会在日志中写入更详细的错误。所以找到那个日志文件应该在哪里并检查它。 (它可能不在应有的位置,这可能与与用户关联的权限有关,该服务是 运行ning as)。如果它存在,它可能有助于追踪特定问题。