【问题标题】:404 error on including extra url patterns with Django在 Django 中包含额外的 url 模式时出现 404 错误
【发布时间】:2015-10-20 07:16:21
【问题描述】:

我的 django 应用程序遇到了一个基本的 404 错误问题,我无法解决...也许有人可以给我一个提示?

所以我的问题如下:我目前正在开发一个网站,其中包含用于多种电话服务的分析工具。每个服务在数据库中都有自己的 serviceid 编号,以便能够单独对其进行分析。因此,我使用相对 url 而不是硬编码所有内容,因为它是最聪明的解决方案,将 serviceid 提供给我的 views.py。

我认为使用相对 url 将是最好的解决方案,因为每个服务都以完全相同的方式进行分析。我设法在模板页面的 html 中执行此操作,但是当我调用其中一个网页时,我发现了 404 错误。例如,当我调用 portal/desiractif/duree 时,这是一个 404 错误,但当我自己调用 portal/desiractif 时,它正在工作......

我以https://docs.djangoproject.com/en/1.8/topics/http/urls/#including-other-urlconfs 为例。

这是我的 urls.py :

from django.conf.urls import include, url
from django.contrib import admin

extra_patterns = [
    url(r'^$', "analytics.views.service_views.service_index"),
    url(r'^duree/$', "analytics.views.service_views.service_duree"),
    url(r'^fixevsmobile/$', "analytics.views.service_views.service_fixvsmobile"),
]

urlpatterns = [
    ....
    url(r'^portal/desiractif/$', include(extra_patterns), {'serviceid' : serviceid}),
    ....
]

这里是我的 html 代码的一部分以及页面之间的相对链接:

<ul class="nav nav-pills nav-stacked">
   <li role="presentation"><a href="">Index</a></li>
   <li role="presentation"><a href="fixevsmobile">Fixe vs mobile</a></li>
   <li role="presentation"><a href="#">Behaviour</a></li>
   <li role="presentation"><a href="#">Rappels</a></li>
   <li role="presentation"><a href="duree">Time</a></li>
</ul>

换句话说,相对 html 链接可以正常工作,但 Django 返回 404 错误。

【问题讨论】:

    标签: html django http-status-code-404


    【解决方案1】:

    应该是:

    from django.conf.urls import include, url
    from django.contrib import admin
    
    extra_patterns = [
        url(r'^$', "analytics.views.service_views.service_index"),
        url(r'^duree/$', "analytics.views.service_views.service_duree"),
        url(r'^fixevsmobile/$', "analytics.views.service_views.service_fixvsmobile"),
    ]
    
    urlpatterns = [
        ....
        # Remove the '$' at the end of regex expression
        url(r'^portal/desiractif/', include(extra_patterns), {'serviceid' : serviceid}),
        ....
    ]
    

    r'^portal/desiractif/$' 的末尾不应有 $ 这会导致正则表达式仅匹配模式 portal/desiractif/ 而不是 portal/desiractif/.... 之后的任何内容。由于正则表达式无法将请求的 url 与任何 url 模式匹配,因此它返回 404 error

    $(美元符号):

    $ 匹配字符串的结尾。多行模式下表示当前行结束,否则为字符串结束。

    如果我的正则表达式是b$,那么它将匹配字符串末尾的b

    'b'     # Matches 'b' in 'b'
    'ab'    # Matches 'b' in 'ab'
    'abc'   # Does not match 
    

    【讨论】:

      【解决方案2】:
      url(r'^portal/desiractif/'...
      

      最后删除$

      【讨论】:

        猜你喜欢
        • 2017-06-06
        • 2013-09-22
        • 2011-08-31
        • 2018-03-17
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        • 1970-01-01
        相关资源
        最近更新 更多