0

我有一个 Python 应用程序,它与基于 Windows 的许可程序连接,我需要为此 Python 应用程序提供一个基于 Web 的界面(使用 GET/POST 请求)。我使用 IIS 作为此接口的 Web 服务器,因为我们已经为通过 IIS 工作的其他应用程序提供了基于 Web 的接口。

为了使用这个基于 Windows 的许可程序,每个实例都必须进行资源密集型许可检查调用,然后授予许可。实例完成后,我必须进行资源密集型许可证释放调用,然后将许可证释放回池中。为了提高 Web 应用程序的速度,我希望每个调用只进行一次:Web 服务器启动时(授予许可证)一次,服务器停止时(释放许可证)一次。

根据我的阅读,我得出的结论是,使用 FastCGI(这可能是错误的)将解决具有单线程应用程序的一般设计需求,我将在其中维护我的许可证授予(与 CGI 相反,这需要每个请求的授予和释放)。我的应用程序非常简单,所以我选择了 Bottle 作为框架来构建我的应用程序。我正在使用 wfastcgi 将 Python WSGI 与 IIS 一起使用。

为了使启动/停止代码正常工作,我创建了以下web.config文件app.py

网络配置

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
    <add key="PYTHONPATH" value="C:\web\App"/>
    <add key="WSGI_LOG" value="C:\web\App\wfastcgi.log"/>
  </appSettings>
  <system.webServer>
    <handlers>
      <add name="PythonHandler" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\python\Python37\python.exe|C:\python\Python37\lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script"/>
    </handlers>
  </system.webServer>
</configuration>

应用程序.py

from bottle import default_app, route
import atexit

import myapp

mylicense = None

def wsgi_app():
    global mylicense
    mylicense = myapp.get_license()

    return default_app()

@route('/app/<page>')
def mypage(page):
    return myapp.get_data(mylicense,page)

@atexit.register
def close_server():
    myapp.release_license(mylicense)

据我所知,这是可行的。但是,我觉得我的解决方案非常笨拙。我假设有一些干净的方法可以为 WSGI 注册启动/关闭代码。我也觉得我对全局mylicense变量的使用很糟糕,而且我应该能够更干净地将许可证对象传递到我的路由函数中。

谁能建议我如何才能做得更好/更清洁/更快/更强?

4

0 回答 0