【问题标题】:Cannot get Django App to serve correct URL无法让 Django 应用程序提供正确的 URL
【发布时间】:2013-08-24 07:36:49
【问题描述】:

我正在尝试按照 django 教程设置一个简单的 Django 应用程序和 Django 项目,它提供两个 URL:“/”(索引)和“/testweb”。

如果我导航到http://localhost:8000/testweb,我会看到“索引!”而不是“testweb!” .我做错了什么?

我的项目名为testweb,我的应用程序名为foo。这里是testweb/urls.py

from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
    url(r'^$', include('foo.urls')),
    url(r'^testweb/', include('foo.urls')),
)

这里是foo/urls.py

from django.conf.urls import patterns, url
from django.http import HttpResponse
from foo import views

urlpatterns = patterns('',
    url(r'^$', (lambda x: HttpResponse("index!"))),
    url(r'^testweb/', (lambda x: HttpResponse("testweb!"))),
)

【问题讨论】:

    标签: python regex django django-urls


    【解决方案1】:

    正如我所说,django 正在为两个 URL 运行 index()。

    根据您的代码,当您转到/testweb 时,Django 会匹配testweb/urls.py 中的第二行,然后匹配foo/urls.py 中的第一行。试试/testweb/testweb。你会看到它运行(lambda x: HttpResponse("testweb!"))

    发生这种情况是因为您将两个 URL 都指向 include('foo.urls')。转到/testweb/testweb/urls.py 中的第二个URL 匹配,其中includes foo.urls 并在那里寻找匹配项。由于在/testweb/ 之后您的 URL 中没有任何内容,因此解析器会点击 foo.urls 中的第一个 URL,该 URL 用于 index lambda。 include 不同的 URLConf 或直接引用视图,例如:

    # testweb/urls.py
    urlpatterns = patterns('',
        url(r'^$', (lambda x: HttpResponse("index!")), name='index'),
        url(r'^testweb/', (lambda x: HttpResponse("testweb!")), name='testweb'),
    )
    

    你会得到预期的结果。

    【讨论】:

    • 谢谢!有什么方法可以更松散地耦合项目和应用程序吗?我曾希望我可以只配置项目,以便它只将某些 URL 传递给应用程序,然后依靠应用程序对其进行排序。
    • 是的,这就是include 的用途。您的代码的问题在于它包含与//testweb 根的URL 完全相同的行为。更改根 URLConf (testweb/urls.py) 以指向不同 URL 的不同包含。
    • 当你转到/testweb时,Django会匹配testweb/urls.py中的第二行,然后是foo/urls.py中的第一行。
    • 那么最好的方法是为应用程序提供两个urls.py 文件吗?例如url(r'^$', include('foo_index.urls')), url(r'^testweb/', include('foo_testweb.urls') ?
    • 最好的方法是让您的应用程序的urls.py 指定您想要点击的视图。
    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 2012-04-12
    • 2014-11-27
    • 2021-05-02
    • 2023-03-14
    • 2017-11-23
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多