【问题标题】:Django + mod_wsgi: Why is empty url pattern always evaluated?Django + mod_wsgi:为什么总是评估空 url 模式?
【发布时间】:2014-05-29 16:15:24
【问题描述】:

我有一个非常简单的带有 url 模式的 Django 项目,类似于这个:

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^log/', include('apps.logging.urls')),
    url(r'^OPTION1/?', index, name="index"),
    url(r'^OPTION2/?', index, name="index"),
    url(r'^$', index, name="index"),
    url(r'^.+/?', RedirectView.as_view(url="/", permanent=False)),
)

所以本质上,我希望在 url 为 /OPTION1/OPTION2/ 时呈现索引视图。我也尝试将这个逻辑放到一个正则表达式中,但我总是遇到同样的问题:

只要我在实际服务器上以生产模式工作,除了正常的之外,总是会评估 emtpy url 模式 (^$)。因此,如果有人导航到/OPTION1,索引视图实际上会调用两次,一次使用/,一次使用/OPTION1 作为路径。

一旦我注释掉空的 url 模式,一切正常。我也没有重定向(除了您在 url 模式中看到的那个,但我可以将其注释掉并且问题仍然存在),这可能导致此问题并且返回的状态代码始终为 200。

那么有人知道发生了什么吗?

【问题讨论】:

  • 您确定您没有看到浏览器对 /favicon.ico 或其他内容的并行请求吗?检查您的 Apache 访问日志以确保没有并行请求。

标签: python django apache url mod-wsgi


【解决方案1】:

你可以使用它在 xyz 选项上重定向到你的主页:

url(r'^/(?P<slug>[^\.]+)/$', anotherIndex),

在视图中你可以使用这个:

from django.shortcuts import HttpResponseRedirect

def anotherIndex(request, slug):
    redirect_url = "/"
    if slug == "OPTION1":
         redirect_url = "/OPTION1"
    elif slug == "OPTION2":
         redirect_url = "/OPTION1"
    return HttpResponseRedirect(redirect_url)

希望对你有帮助

【讨论】:

  • 这不会导致重定向循环吗?
  • 你实际上通过同一个方法索引发送 4 个 url,除了 log 和 admin,你将所有 4 个 url 发送到同一个视图,无论你调用什么 url,你都会被重定向到视图索引
  • 是的,应该这样工作。但我对你的方法的问题是,如果这不会导致无限循环的重定向,因为你重定向到你来自的同一个 url。
猜你喜欢
  • 1970-01-01
  • 2017-01-09
  • 2014-03-14
  • 1970-01-01
  • 2011-05-07
  • 2022-01-22
  • 2015-12-07
相关资源
最近更新 更多