Мы программируем классический ASP для большого (унаследованного) веб-приложения.Это работает довольно хорошо, используя WSC (компоненты сценариев Windows) для отделения GUI от бизнес-логики;WSC содержат бизнес-логику, для отображения возвращаемой информации используется классический asp.Возвращаемые WSC строковые значения, наборы записей ADO и в некоторых случаях vbscript-объекты.
В настоящее время мы пытаемся перейти с использования VBscript внутри WSC на Python (pyscript), чтобы, по крайней мере, используемый язык был современным иимеет более современные доступные функции (такие как SOAP, решения ORM или Memcached).
Использование кода Python в классическом ASP прекрасно работает при использовании pywin32 и регистрации Python в качестве языка сценариев, но мы сталкиваемся с двумя фундаментальными проблемами:
В WSC использование тега "Implements" должно сделать все стандартные объекты IIS (сервер, сеанс, запрос, ответ и т. Д.) Доступными для кода внутри WSC.При использовании Python он просто не работает.Возможно, я использую неправильный синтаксис или мне нужны дополнительные определения в коде Python, но я не могу понять, как добраться до этих объектов.Дополнительная информация о WSC: http://aspalliance.com/414
При возникновении ошибки на странице ASP, трассировка отображается в браузере, и все в порядке.Однако, если в WSC происходит ошибка, браузер не имеет или почти не имеет обратной связи.При использовании VBscript Windows позволяет разработчику выбрать отладчик, и (в нашем случае) Visual Studio запускает и показывает нам ошибку и строку, содержащую ошибку.Это работает до тех пор, пока вы разрабатываете локально (поэтому на локальной машине разработки работает IIS).При использовании Python ничего не происходит, только очень расплывчатое сообщение в браузере, например:
error '80020009' Произошло исключение.
Я пробовал разные способы решения этой проблемы;Я попытался импортировать win32traceutil и открыть окно сборщика трассировки.Странно то, что он захватывает все мои операторы print (), но не сообщения об ошибках Python.Кажется, будто stdout захвачен, а stderr - нет.Если в Python есть другие способы перенаправления или отображения сообщений об ошибках, я бы тоже хотел попробовать их.Я даже подумывал об использовании очень большой попытки ... кроме, но, помимо очень плохого стиля, WSC содержит множество отдельных функций, и это будет означать реализацию try..except в каждой функции.Я действительно не хочу туда ехать.
Если кто-нибудь может помочь мне с этими двумя проблемами (особенно nr 2 - большой демонстрационный пример использования Python в нашей компании), это было бы очень признательно.Если есть какой-то другой способ сделать отслеживание Python каким-либо образом видимым, это было бы большим шагом вперед.
Кстати, я уже публиковал этот вопрос в разных списках рассылки, включая список рассылки pywin32, но покатеперь никто не смог нам помочь.
Итак, помогите мне stackoverflow, вы моя единственная надежда ...
Спасибо всем,
Эрик
Ниже приведен очень простой пример, состоящий из страницы ASP и Python WSC, страница ASP создает экземпляр WSC и вызывает некоторые функции из него.Response.write не будет работать, потому что по какой-то причине объект Response не может быть использован (проблема № 1), также, если в коде Python есть ошибка, браузер не покажет трассировщику ни одно ясное сообщение (проблемаnr.2).Код должен выполняться под управлением IIS, а Python и PyWin32 должны быть установлены (или дистрибутив Python activestate, который уже будет включать PyWin32)
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()
%>