Django教程:完成第一页后出现无法解释的404错误

时间:2016-02-11 04:29:34

标签: python django

我完成了https://docs.djangoproject.com/en/1.9/intro/tutorial01/

预期的行为有效。我的民意调查指数正在显示。但是有一个我无法理解的意外后果。当我去localhost:8000时,我找不到一个页面。为什么?

这是我的mysite/mysite/urls.py,正如教程所解释的那样。

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

urlpatterns = [
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', admin.site.urls),
]

服务器说:

Not Found: /
[11/Feb/2016 04:25:46] "GET / HTTP/1.1" 404 2010

当我删除民意调查行时,404消失。即:

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

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

现在服务器说:

Not Found: /
[11/Feb/2016 04:24:23] "GET / HTTP/1.1" 200 1767

所以我猜这是一些默认的怪癖,但我仍然不完全知道我是犯了错误还是这是定义的行为。我的其他代码与教程的代码片段相同。

3 个答案:

答案 0 :(得分:5)

有趣的观察!之前从未注意过。

当您访问URL时,Django会尝试将其与所有已定义的模式(按定义顺序)匹配。对于匹配的第一个模式,将调用相应的视图。

但是如果没有定义URL模式,那么django将打印您在Not found: {url} shell中看到的runserver。它会像预期的那样尝试提出404异常。

但是在debug模式下,它有点额外。 我们在django/views/debug.py

中检查此功能
def technical_404_response(request, exception):
    # some extra code here
    if (not tried                           # empty URLconf
        or (request.path == '/'
            and len(tried) == 1             # default URLconf
            and len(tried[0]) == 1
            and getattr(tried[0][0], 'app_name', '') == getattr(tried[0][0], 'namespace', '') == 'admin')):
        return default_urlconf(request)
    # more extra code here

Django在这里尝试做的是检查它尝试了多少个URL模式。如果特定条件满足,它将尝试返回default_urlconf。 这些具体条件是:

  • 如果没有定义URL模式
  • 如果尝试过的网址是' /',并且定义的唯一网址格式适用于admin应用

所以我们从这里学到的是,如果没有定义URL模式,那么Django将始终调用default_urlconf。尝试同时删除admin网址,然后访问任意随机网址。你总会得到这样的东西:

Not Found: /random/url/
[11/Feb/2016 04:24:23] "GET /random/url/ HTTP/1.1" 200 1767

现在让我们看一下default_urlconf代码:

def default_urlconf(request):
    "Create an empty URLconf 404 error response."
    t = DEBUG_ENGINE.from_string(DEFAULT_URLCONF_TEMPLATE)
    c = Context({
        "title": _("Welcome to Django"),
        "heading": _("It worked!"),
        "subheading": _("Congratulations on your first Django-powered page."),
        "instructions": _("Of course, you haven't actually done any work yet. "
            "Next, start your first app by running <code>python manage.py startapp [app_label]</code>."),
        "explanation": _("You're seeing this message because you have <code>DEBUG = True</code> in your "
            "Django settings file and you haven't configured any URLs. Get to work!"),
    })

    return HttpResponse(t.render(c), content_type='text/html')

(它返回正确的HttpResponse =&gt; 200 HTTP代码)

答案 1 :(得分:2)

本教程未定义当您转到网站根目录时会发生什么,它只处理polls应用。如果要在浏览http://localhost:8080/时查看某些内容,则必须添加网址映射。

举个简单的例子,尝试在mysite/urls.py中进行以下更改:

from polls import views

urlpatterns = [
    url(r'^$', views.index, name='site_index'),
    ...
]

从现在开始,当您浏览网站根目录时,您应该会看到polls应用的索引视图。

答案 2 :(得分:0)

万一我遇到类似的问题。

我正在使用django rest框架构建API。端点希望当前用户使用令牌进行身份验证。我正在使用drf-simplejwt

我意识到我的问题是从前端以错误的格式传递令牌,从而使用户呈现为AnonymousUser。

  Get(endpoint) {
    if (this.token !== null) {
      let auth = `bearer ${this.token}`;
      let headers = new HttpHeaders({
        "Content-Type": "application/x-www-form-urlencoded",
        Authorization: auth
      });

      let fullurl = `${this.baseUrl}${endpoint}`;
      return this.http
        .get(fullurl, { headers: headers })
        .pipe(catchError(this.handleError));
    }
  }

将承载更改为承载,因为应该可以解决该问题。