zoukankan      html  css  js  c++  java
  • [web部署] flask-windows

    由于supervisor不支持windows,但要防止程序异常中断,所以需要采取措施

    通过pywin32,使得flask以服务的方式运行

    创建pythonservice.py

    import win32serviceutil
    import win32service
    import win32event
    from flask import Flask

    class win32test(win32serviceutil.ServiceFramework):
    _svc_name_ = "Flask Service"
    _svc_display_name_ = "Flask Service"
    _svc_description_ = "Flask App Service"

    def __init__(self, args):
    win32serviceutil.ServiceFramework.__init__(self, args)
    self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)


    def SvcDoRun(self):
    self.main()
    win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

    def SvcStop(self):
    self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
    win32event.SetEvent(self.hWaitStop)
    self.ReportServiceStatus(win32service.SERVICE_STOPPED)

    def main(self):
            app = Flask(__name__)
    app.run(host="0.0.0.0",port=5000)

    if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(win32test)

    安装服务:python flaskservice.py install

    启动服务:python flaskservice.py start

    停止服务:python flaskservice.py stop

    删除服务:python flaskservice.py remove

    出现的问题即解决过程:

    flask不能以debug模式启动,必须关掉debug

    问题:服务没有及时响应启动或控制请求

    查了下,通过python flaskservice debug的方式,但错误信息是注册表问题,操作了半天的注册表,问题依然存在

    之后查到NSSM也可以通过服务的方式运行,但报错信息还是一致,所以原因应该是一样的

    通过查看windows日志解决问题

    (参考:https://blog.csdn.net/ywg_1994/article/details/82430943)

    之后看了下报错信息,提示可以查看windows日志,这下打开了新世界的大门

    控制面板-系统和安全-管理工具-查看事件日志,等加载完毕,左侧选择windows日志-应用程序,这时观察右边,里面果然有Flask Service,点击查看错误信息

    from jinja2 import escape 未找到模块jinja2

    但明明是安装了的

    pip show jinja2

    显示位置为  c:usersusernameappdata oamingpythonpython36site-packages

    但python解释器明明是在c:program filespythonpython36libsite-packages

    卸载重装模块,结果还是在用户目录下

    有了日志就不怕了,出了问题都可以知道原因,解决即可

     

    通过whl手动指定安装位置:

    (但pip install --target=c:program filespython….. jinja2,显示files…目录未找到,wtf)

    最后通过下载whl文件,将文件放到目标目录,pip install xx.whl完成指定目录的模块安装

    之后启动服务提示未找到markupsafe,同样下载whl进行安装

    问题:提示服务开启后又被关闭

    日志中:The instance's SvcRun() method failed <Error getting traceback - traceback.print_exception() failed %2: %3

    (参考:https://stackoverflow.com/questions/52698395/windows-service-with-flask-only-run-in-debug-mode-normal-mode-seem-crash)

    在pythonservice.py的最前面添加下面语句:

    sys.stdout = sys.stderr = open(os.devnull, 'w')

    然后重启服务,果然可以了;(原因不是很清楚,问题应该是无法输出错误信息,解决方案思路应该是给标准输出指定一个设备空文件)

    之后在flask服务中设置:程序异常后-重新启动即可

    也可以配合pyinstaller使用,更方便

    在虚拟环境中也是可以的,操作与之前一样

    python的服务主要是依赖于PythonService.exe和所写的服务文件(pythonservice.py)

    保证这两个路径即可:

    PythonService.exe的路径在服务中就可以查看

    image

    服务运行文件可以在服务的注册表中查看:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices

    image

    image

    如果安装上面直接不可以启动的话,参考:https://stackoverflow.com/questions/34696815/using-pythonservice-exe-to-host-python-service-while-using-virtualenv

    其他:

    python xxservice.py debug就是坑,最后已经可以启动服务了,执行还是报注册表未找到错误,wtf

    中间还尝试了windows-supervisor,结果根本就不行

    stackflow很完善,对于这些‘小众’的bug,都有相应的讨论及解决方案,很nice

    流程:

    python(环境变量配置,安装virtualenvwrapper,workon环境变量配置)

    虚拟环境(安装模块的离线包)

    安装服务,启动

  • 相关阅读:
    SpringBoot集成swagger后出现: Failed to start bean ‘documentationPluginsBootstrapper‘的解决方法
    [转]When allowCredentials is true, allowedOrigins cannot contain the special value “*“
    SpringBoot 集成Swagger后提通过http://localhost:8001/swaggerui.html#/访问得不到页面
    C#窗体开发
    如何查看一个域名所对应的IP地址?
    Vetur can't find `tsconfig.json` or `jsconfig.json` in XXX
    npm 搜索
    查看android 中sqlite数据库的表,发现没有表结构和数据问题
    Another Intro for Cookies
    TypeScript Crash Course: Property Access Modifiers
  • 原文地址:https://www.cnblogs.com/justaman/p/11914886.html
Copyright © 2011-2022 走看看