在 DotNetNuke 中运行 IronPython
如何用 Python 的方式来脚本化 DotNetNuke。
引言
如果您听说过或使用过 DotNetNuke 并为其构建过一些模块,您可能知道,在 Web 开发中,通常,在网站中构建小型快速的功能需要大量的编码,而且通常需要一些古怪(通常价格昂贵)的 IDE。在构思为 DotNetNuke 创建一个用于创建宏的新模块时,我突然想到一个主意:嘿,我们为什么不都使用脚本呢?
好吧,如今一切都可以通过脚本完成——甚至操作系统的一部分都可以通过脚本完成。随着计算机速度和内存的不断提升,这实际上并没有那么重要,因为通过不同种类的脚本语言,我们可以轻松而强大地访问各种底层功能,而这些功能通常需要相当广泛的各种技术知识。考虑到这一点,我认为在另一个解释型语言中运行一个解释型语言并不是个坏主意。
要求
您只需要 .NET 2.0 和运行在网站上的 DotNetNuke 4.x - IronPython 需要 .NET 2.0,因此 DotNetNuke 4.x 也需要。我很希望看到这个在 .NET 1.1 和 DotNetNuke 3.x 中也能工作,但不幸的是,IronPython 大量依赖于泛型,无法轻松地移植到 .NET 1.1。
工作原理
基本思想是,我们安装了 DotNetNuke 门户,并在其中运行各种模块,这些模块实际上是相对独立的软件,依赖于 DotNetNuke 核心框架。另外,IronPython 模块(仍是一个工作名称)是一个普通模块,它实际上将 IronPython 运行引擎嵌入到运行在 DotNetNuke ASP.NET 应用程序中的模块中,而该应用程序又运行在 IIS 的工作进程中。这使得开发人员可以在模块中快速运行小型(甚至大型)Python 脚本,同时仍然能够完全控制当前模块的功能、DotNetNuke 门户或主机的功能,甚至 ASP.NET 应用程序的功能。这是通过在初始化实际 Python 引擎后默认提供以下模块、对象和命名空间来实现的:
- App - 这是一个 ASP.NET 应用程序对象,包含 DotNetNuke。通过它,您可以直接访问普通的 ASP.NET 对象,如
Request
、Server
、Response
等。其他应用程序特定的项也可用;只需键入“dir(App)”即可查看所有内容。 - DotNetNuke - 好的,这个很明显。此对象提供有关运行 DotNetNuke 实例的所有信息,并具有对用户、选项卡/页面、门户等的所有区域访问权限。随意探索以了解您可以找到什么。
- Handler - 这是一个“
Web.HttpContext.Current.CurrentHandler
”的对象,它包含正如其名所示的 HttpContext 的当前处理程序。目前,我不知道它的用途,但如果您发现什么,请给我提示。只是为了**完全访问**而导入。 :D - Page - 这个对象为用户提供了对 ASP.NET 页面的直接访问权限——是的,是 ASP.NET 页面,而不是 DotNetNuke 的选项卡/页面对象。您也可以通过“
Handler.Page
”访问它。 - Web - 这是 .NET 基本类库中
System.Web
命名空间的快捷方式。出于某种原因,尽管 IronPython 引擎在 ASP.NET 应用程序下运行,但Web
命名空间不会自动加载,而System.Web
命名空间必须通过调用“System.Reflection.Assembly.GetCallingAssembly
”来在代码隐藏文件中定位。没关系——这样也有效。
然后是一些更有趣的对象
- Module - 这是我们运行 IronPython 引擎的实际模块。所有 DotNetNuke PortalModuleBase 功能都可用。
- IronCanvas - 好的,现在我们开始进入正题了——这可能是最有趣的对象。这是一个普通的
PlaceHolder
控件,我们可以在其中放置其他 ASP.NET 或 DotNetNuke 控件。
这些是为开发人员提供的基本模块和对象,可以用来试验和了解它们的工作原理。我还不是一个很好的 Python 程序员,所以我只提供了一些简单的代码示例,希望能让您对我们正在讨论的内容有一个大致的了解。
这是一个简单脚本,允许您列出 DotNetNuke 中的所有用户
uc = DotNetNuke.Entities.Users.UserController()
users = uc.GetUsers(False,False)
for n in users : print n.FullName + " = " + n.Username
print "\nUsers in system : "
print users.Count
这是另一个列出所有页面(包括管理和主机页面)的脚本
tc = DotNetNuke.Entities.Tabs.TabController()
tabs = tc.GetAllTabs()
for t in tabs : print t.TabName
明白了?您还可以使用以下语句直接写入响应流
App.Response.Write("Hello World")
以下代码会将用户的浏览器重定向
App.Response.Redirect("http://www.dotnetnuke.com/")
编写正在运行的脚本
使用当前版本的模块,您有两个选择:您可以操作 IronPython 控制台,或者您可以设置一个每次加载模块时运行的脚本。这意味着您可以使用普通的 DotNetNuke 基于角色的安全设置来限制模块的运行权限。目前,编写 Python 脚本并不像应该的那样容易,但未来的版本可能会有更好的编辑器。目前,您可以通过从模块的下拉菜单中选择“Settings”来访问简单的编辑器。在那里,您应该在 Settings 部分的底部看到“IronPython Settings”。打开它后,您会看到一个简单的文本框,允许您编写自己的代码。入门时,可以输入类似这样的脚本:
cal = Web.UI.WebControls.Calendar()
IronCanvas.Controls.Add(cal)
不要勾选“Keep IronPython engine in user session...”,因为目前这似乎会产生一些奇怪的结果。单击“Update”后,您应该会在模块中看到一个简单的 ASP.NET 日历控件。阅读代码应该能让您大致了解。注意!目前,没有解决方案来处理 ASP.NET 或 UserControls 中的事件,因此如果您对此感兴趣,请查看后续的 Beta 版本。有一个“pyevent
”模块可供导入,但在撰写本文时,我还没有想出如何创建一个响应 ASP.NET 控件事件的函数——这可能是因为 IronPython 处于 Beta (6) 阶段,或者 IronPython 本身不适合 ASP.NET 这样的环境。
当然,您也可以在脚本输入中放入前面提到的一个(或两个)脚本——只是为了看看它们是如何工作的。
也许这次的内容足够了——请给我反馈、想法,如果有什么地方我写错了,请纠正我。希望一旦我们的模块 1.0 版本发布,IronPython 也能完成最终发布,这样我们就能获得所有可以在“遗留”Python 中找到的酷炫模块。