Python Flask 实现 API 及封装为 Windows 服务的方法

闻溪
闻溪
发布时间:2026-10-13| 4人浏览过
原创

本文介绍如何使用 Python Flask 框架创建 RESTful API,包括获取 POST 请求中的 JSON 数据。重点讲解如何将 Flask 应用封装为 Windows 32 位服务,通过启动独立线程运行 app.run() 解决服务启动后无法停止的问题,确保服务生命周期可控。

本文分享了基于 Python 和 Flask 框架实现 API 的具体操作步骤,供读者参考。

Flask 框架基础

#-*-coding:utf-8-*-
 
#pip install flask
#pip install flask-restful
 
from flask import Flask
 
app = Flask(__name__)
 
@app.route('/')
def index():
  return "hello world!"
 
if __name__ == '__main__':
  app.run(debug=True)

在 PyCharm 中运行该程序后,打开浏览器访问 http://127.0.0.1:5000/,即可看到返回的网页内容。

结合 Flask 与 flask_restful 构建一个简单的应用程序示例。

from flask import Flask
from flask_restful import Resource,Api
 
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
  def get(self):
    return {"hello":"world"}
 
api.add_resource(HelloWorld,'/')
 
if __name__ == '__main__':
  app.run(debug=True)

使用 Python 和 Flask 创建 API,重点演示如何获取 POST 请求中传递的 JSON 数据。

from flask import Flask,abort,jsonify,make_response,request
 
app = Flask(__name__)
 
@app.route('/analyze/' ,methods=['POST'])
def call_wiscan_analyze():
  if not request.json or not 'path' in request.json:
     abort(400)
  path = request.json['path']
 
 
if __name__ == '__main__':
  app.run(port='50055',debug=True)

具体的请求方式如下。

from requests import post
 
if __name__ == '__main__':
  path='"F:/nb_org_data/86574FG01/2013/1029/0008/86574FG01201310290008.img"'
  ret = post('http://localhost:50055/analyze/',json={'path':path})
  print(ret.text)

将 API 应用封装为 Windows 32 位服务。

import win32serviceutil
import win32service
import win32event
import win32timezone
from flask import Flask,abort,jsonify,make_response,request
import threading
 
app = Flask(__name__)
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
 
@app.route('/analyze/' ,methods=['POST'])
def call_wiscan_analyze():
  if not request.json or not 'path' in request.json:
     abort(400)
  path = request.json['path']
 
def thread_target():
  app.run(port='50055', debug=True)
 
class GRPCWin32Client(win32serviceutil.ServiceFramework):
  _svc_name_ = 'GRPCWin32Client'
  _svc_display_name_ = 'Nuctech GRPC Client'
  _svc_description_ = 'wiscan grpc client'
 
  def __init__(self, args):
    win32serviceutil.ServiceFramework.__init__(self, args)
    self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
    #self.logger = self._getLogger()
    self.run = True
 
  def SvcDoRun(self):
    th = threading.Thread(target=thread_target)
    th.start()
    try:
      while self.run:
        time.sleep(_ONE_DAY_IN_SECONDS)
 
    except KeyboardInterrupt:
      pass
 
    pass
 
  def SvcStop(self):
    self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
    win32event.SetEvent(self.hWaitStop)
    self.run = False
 
if __name__ == '__main__':
  import sys
  import servicemanager
  if len(sys.argv) == 1:
    try:
      evtsrc_dll = os.path.abspath(servicemanager.__file__)
      servicemanager.PrepareToHostSingle(GRPCWin32Client)
      servicemanager.Initialize('GRPCWin32Client', evtsrc_dll)
      servicemanager.StartServiceCtrlDispatcher()
    except win32service.error as details:
      import winerror
      if details == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
        win32serviceutil.usage()
  else:
    win32serviceutil.HandleCommandLine(GRPCWin32Client) 

需要注意以下关键点。

必须启动一个线程来运行 app.run(),否则在安装并启动 Win32 服务后,由于 Flask 内部循环未结束,会导致服务无法停止。

以上为本文的全部内容,希望对读者的学习有所帮助,欢迎继续支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。