【问题标题】:Django url routing with flatpages带有平面页面的 Django url 路由
【发布时间】:2014-02-22 15:34:05
【问题描述】:

在使用平面页面时,我很难理解 django 中 url 路由的工作原理,我希望有人可以查看我的代码并解释我做错了什么。

此外,在调试此问题时提供一些建议会非常有帮助 - 理想情况下,当请求成功解决时,我想看看 django 如何达到该解决方案。目前我只看到 404 时尝试的 url 模式。

提前致谢,

在 settings.py 我有 - APPEND_SLASH = True

我有以下 url 结构,在括号中我指出了我认为我的 reg ex 应该做什么..

#urls.py

url(r'^$', home), # (match / and nothing else)
url(r'^fa/$', home), # (match /fa and nothing else)
url(r'^en/$', en_home), # (match /en and nothing else)

url(r'^fa', include('ir_site.urls')), # (match any path like fa/*/) 
url(r'^en', include('en_site.urls')), # (match any path like en/*/)

#in ir_site.urls
urlpatterns = patterns('',
    url(r'contact/$', views.static_contact) # (match fa/contact)
)
urlpatterns += patterns('django.contrib.flatpages.views', 
    (r'^(?P<url>.*/)$', 'flatpage'), # (match any fa/*/ not resolved or 404)
)

#in en_site.urls
urlpatterns = patterns('',
    url(r'contact/$', views.static_contact) # (match en/contact)
)
urlpatterns += patterns('django.contrib.flatpages.views', 
    (r'^(?P<url>.*/)$', 'flatpage'), # (match any en/*/ not resolved or 404)
) 

我有以下平面页面

/en/test/
/fa/test/
/test/
/en/test2

测试结果:

/ - Fine
/en - Fine
/fa - Fine
/test - Fine    
/fa/test - Fine
/en/test - Extra / is appended results in 404
/en/test2 - Fine, but uses the flatpages template in the ir_site app
/en/contact - Fine
/fa/contact - Fine

我感觉问题在于 (r'^fa') 和 (r'^en') 无法正常使用平面页面的全部捕获,但我不知道如何查看 为什么会这样,因为我在这个阶段缺乏任何调试技能。

帮助非常感谢...

【问题讨论】:

    标签: django django-urls django-flatpages


    【解决方案1】:

    将您的 urls.py 更改为以下包含的内容。你需要在 url 后面加上 /。

    url(r'^fa/', include('ir_site.urls')),
    url(r'^en/', include('en_site.urls')),
    

    对于您的 url 参数,我认为您最好使用 + 而不是 *,因为它需要 1 个或多个字符,而 * 为 0 个或更多。

    最后,在 ir_site.urls 和 en_site.urls 中,您应该使用 ^ 引导联系人,这样它只会在联系人是 url 的第一部分(在 en/ 或 fa/ 之后)时匹配。

    编辑: 更改平面 url 模式。当前使用. 将匹配/。我给出的示例将匹配任何带有连字符的长字母数字字符。

    (r'^(?P<url>[-\w]+)/$', 'flatpage'),
    

    【讨论】:

    • 嗯,已经尝试过了,但没有任何改变。问题在于平面页面网址而不是联系人网址,它总是可以解决。此外,似乎 en/test 无法解析,因为 django 将其解析为 /en/test// (双斜杠),即 404
    • 抱歉,但不确定为什么将 '.*' 更改为 '[-\w]+' 会有帮助? (我试过了,但没有..)问题肯定出在包含问题上,尽管当我注释掉 'r'^fa/' 和 'r'^en/' 时,平面页面仍然可以解决。问题是 ir_site.urls 和 en_site.urls 中的包罗万象的模式
    【解决方案2】:

    因此,通过删除 urls.py 中对平面页面的任何引用并仅使用中间件,我发现所有问题都消失了,一切都开始按预期工作。

    【讨论】:

      猜你喜欢
      • 2021-04-11
      • 2023-03-15
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 2020-03-04
      • 2021-06-22
      相关资源
      最近更新 更多