我们正在为大型(传统)Web应用程序编写经典ASP。使用WSC(Windows脚本组件)将GUI与业务逻辑分离,这非常有效; WSC包含业务逻辑,经典asp用于显示返回的信息。 WSC的返回字符串值,ADO记录集以及某些情况下的vbscript对象。
目前我们正在尝试从使用WSCs内部的VBscript切换到Python(pyscript),因此至少使用的语言是现代的,并且具有更多现代功能(如SOAP,ORM解决方案或Memcached)。
在经典ASP中使用Python代码可以正常使用pywin32并将Python注册为脚本语言,但我们遇到了两个基本问题:
在WSC中,使用“implements”标记应该使WSC内部的代码可以使用所有IIS的标准对象(服务器,会话,请求,响应等)。使用Python时,它似乎不起作用。也许我使用的语法不正确,或者我在Python代码中需要一些额外的定义,但我似乎无法弄清楚如何获取这些对象。 有关WSC的更多信息:http://aspalliance.com/414
当ASP页面发生错误时,浏览器中会显示回溯并且一切正常。但是,如果WSC内部发生错误,则对浏览器的反馈很少或根本没有。使用VBscript时,Windows允许开发人员选择调试器,并且(在我们的例子中)Visual Studio启动并向我们显示错误和包含错误的行。只要您在本地开发(因此本地开发机器运行IIS),这就可以工作。 使用Python时,没有任何反应,只是浏览器中的一个非常模糊的消息,即:
错误'80020009' 发生了异常。
我尝试过不同的方法解决这个问题;我尝试导入win32traceutil并打开跟踪收集器窗口。奇怪的是它会捕获我的所有print()语句,但不会捕获Python错误消息。似乎stdout似乎被捕获了,但stderr却没有。如果Python中有任何其他方法可以重定向或显示错误消息,我也想尝试一下。我甚至考虑过使用一个非常大的try ..except,但除了非常糟糕的样式之外,WSC还包含一堆独立的函数,这意味着在每个函数中实现try..except。我真的不想去那里。
如果有人能帮我解决这两个问题(特别是nr 2是我们公司使用Python的一大亮点),我们将不胜感激。如果有任何其他方法可以以某种方式显示Python回溯,那将是向前迈出的一大步。
顺便说一下,我已经将这个问题发布到不同的邮件列表中,包括pywin32邮件列表,但到目前为止还没有人能够帮助我们。
所以,帮助我stackoverflow,你是我唯一的希望......
全部谢谢,
埃里克
下面有一个非常简单的示例,包括ASP页面和Python WSC,ASP页面实例化WSC并从中调用一些函数。 Response.write不起作用,因为由于某种原因无法使用Response对象(问题nr.1),如果Python代码中有错误,浏览器也不会显示跟踪器或任何明确的消息(问题NR 2)。 代码需要在IIS ofcourse下运行,并且需要安装Python和PyWin32(或者已经包含PyWin32的activestate Python发行版)
python.wsc:
<?xml version="1.0" encoding="Windows-1252" ?>
<component>
<?component error="true" debug="true"?>
<registration
description="python"
progid="python.WSC"
version="1.00"
classid="{F236F59E-3F6F-44EA-A374-DBFA9F90ECB3}"
</registration>
<public>
<method name="testmethod">
</method>
<method name="helloWho">
<PARAMETER name="who"/>
</method>
</public>
<implements type="ASP" id="ASP"/>
<script language="Python">
<![CDATA[
def testmethod():
Response.Write('output of results converted to a string')
def helloWho(who):
return "Hello "+who+"!"
]]>
</script>
</component>
ASP页面:
<%@ Language=VBscript %>
<%
set pythonwsc= GetObject("script:"&Server.MapPath("./python.wsc"))
response.write(pythonwsc.helloWho("world")&"<br>")
pythonwsc.testmethod()
%>
答案 0 :(得分:0)
对于#2,您需要捕获调用组件的VBScript中的异常。 WSC只是一个com组件。当你调用你的WSC时,忽略一下python正在运行。它只是一个COM组件。
调用该组件时可能会出错。在调用可能失败的组件时,使用错误处理是一种很好的做法。在VBSCript中,这意味着On Error Resume或其他。
在Javascript中,它表示try..catch子句。
好奇:为什么在WSC中使用python?为什么不只是Jscript - 更主流,也很现代。