在bookmarklet提交或相关数据库操作上的mod_wsgi意外行为

时间:2010-06-29 21:15:27

标签: apache deployment mod-wsgi bookmarklet flask

[在下方更新]

我在使用带有一些javascript书签功能的mod_wsgi在apache上部署站点时遇到了一些问题; alpha网站已启动并可在此处使用:stemhub.org。问题是书签(这是一个浏览器菜单按钮)提交到像

这样的页面

http://stemhub.org/submit/http://the-users-link.com/here

然后返回一个表单以保存有关链接的元数据。视图函数(flask / werkzeug应用程序)检查数据库以查看是否已添加链接,然后返回带有预先存在或新分配的链接ID的表单,我想这可能会触发某种时序问题。非常奇怪的是,当我第一次提交链接时,我得到了http://stemhub.org/submit/http://the-users-link.com/here页面,其中包含“未找到”的apache错误,但如果我重新加载页面,我会按预期获得该表单。错误日志包含有关线程异常的消息,但它们也会在网站按预期执行时执行。

该应用程序在另一个端口上并行部署 - stemhub.org:5000 - 在Tornado上运行并且运行正常,以及本地开发版本。

以下是关于它们出现问题的小书签:

工作端口5000版本:javascript:(function(){window.open('http://stemhub.org:5000/submit/'+encodeURIComponent(window.location.href),'height=200,width=150')}())

问题端口80版本:javascript:(function(){window.open('http://stemhub.org/submit/'+encodeURIComponent(window.location.href),'height=200,width=150')}())

更新:由于某些原因属于另一个标记,将javascript方法encodeURIComponent更改为encodeURI会使所有内容按预期工作,至少在FF和Chrome中是如此。然而,格雷厄姆·杜普顿(Graham Dumpleton)将在未来采取一些更为明智的建议。

1 个答案:

答案 0 :(得分:2)

无论您遇到什么问题,您在URL中放置第二个URL的方式都不适用于Apache。这是因为Apache会将重复斜杠折叠成一个斜杠,而那个单斜杠就是Apache托管的应用程序将在PATH_INFO中看到的所有斜杠。

换句话说,如果将其他动态Web应用程序托管机制与Apache结合使用,即使是非Python版本,也不会出现mod_wsgi问题。

BTW,有些人可能会指出未修改的URL在REQUEST_URI中,但依赖于此并不一定是个好主意,因为要弄清楚如何将其拆分并将其映射到SCRIPT_NAME并且PATH_INFO可能并不总是直接取决于是否在Apache中使用了重写规则。

建议您调查第二个URL是查询字符串的一部分,而不是URL路径。