【发布时间】:2013-11-28 21:22:06
【问题描述】:
我是 Python 和 Django 的初学者。
我正在设置一个我在本地编写的程序。在几乎完成让应用程序在服务器上运行之后,我了解到服务器运行的是 python 2.6,而我的本地系统运行的是 2.7。从 url 检索参数时,这似乎给我带来了问题。
我正在使用 Openshift 的服务器。我对服务器了解不多,但我目前的设置是我有一个文件的本地克隆,我在本地处理所有内容,并通过 git 将它们推送到服务器。使用 Openshift 界面内部的预定义快速设置来设置服务器。
我正在使用以下 urlpattern,它在我的计算机上本地运行良好。
url(r'^website/(?P<url>[:\w/\-.]+)$', 'page'),
但是,在我的服务器版本上,我遇到了一些问题。以下 url 将两个不同的 url 返回到视图,具体取决于我是在服务器上还是在本地运行。
#when using this url
website/http://example.com
#local view called page, retrives this argument
http://example.com
#server version retrieves almost the same, but with one / in the beginner less.
http:/example.com
在我看来,反斜杠在某处被砍掉了。如何更改它以解析带有两个反斜杠的参数?
# the receiving view
def page(request, url):
p = Page.objects.get(url=url)
domain = p.website.url
return render_to_response('seo/page.html', {'domain': domain, 'page': p}, context_instance=RequestContext(request))
本地版本返回所需的页面就好了。服务器版本返回:
DoesNotExist at /website/http:/coverme.dk/collections/iphone-sleeves-covers
我注意到这里缺少 http:// 中的一个反斜杠,并假设错误是基于它被错误地发送到视图。
我刚刚用本地版本的数据库中不存在的url进行了测试,它正确显示了错误消息。
我还仔细检查了 url='http://coverme.dk/collections/iphone-sleeves-covers' 的对象是否确实存在。我也和其他几个人核实过。
我已经尝试过处理输入网址,它似乎工作得很好,除非我使用双倍或三倍更多的反斜杠。在第一个反斜杠之后的所有反斜杠都在 url 中被忽略。
/website/http://////coverme.dk////collections/iphone-sleeves-covers
#gives the same as
/website/http:/coverme.dk/collections/iphone-sleeves-covers.
非常感谢任何形式的帮助。一些可以帮助我的文档的链接也将不胜感激。
编辑:更新 django 解决了这个问题。
【问题讨论】:
-
您是否100%确定在本地和生产之间的请求 URL 中使用相同的路径?因为 Python 2.6 和 2.7 版本之间的正则表达式引擎没有改变,所以不会造成这样的差异。
-
无论是什么导致了差异,我现在可以在这里告诉你,那个 url 模式不是问题。
-
您是否尝试过在本地开发服务器的数据库中使用不存在的 URL?也许错误消息在 Python 2.6 和 2.7 上都错误地构造了 URL。
-
您是否 100% 确定
url='http://coverme.dk/collections/iphone-sleeves-covers'的对象确实存在于生产服务器上的数据库中? -
最后但同样重要的是,Django 的版本是否相同?并考虑到配置错误的前端服务器可能会改变 URL 的解释方式。我们可以看到您请求的确切网址吗? URL 参数中的斜杠是否正确转义?
标签: python django python-2.7 python-2.6