我有一个 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
变量的使用很糟糕,而且我应该能够更干净地将许可证对象传递到我的路由函数中。
谁能建议我如何才能做得更好/更清洁/更快/更强?