Django 网址帮助 - 无法访问视图

Django urls help - not able to access view

首先让我说我是 Django 的新手,我意识到这看起来很简单(我希望如此)。

我正在按照一个教程指导我完成一个简单 Django 站点的基本设置,但我发现自己卡在了一个点上,我只是简单地调用教程刚刚包含的一个新视图我加。 (有兴趣的可以看这里https://overiq.com/django/1.10/views-and-urlconfs-in-django/

所以,我的服务器已经启动 运行,我正在尝试访问

http://127.0.0.1:8000/blog/time/

当我尝试访问该视图时,出现错误:

Using the URLconf defined in mysite.urls, Django tried these URL patterns, in this order:

^blog ^time/$ [name='todays_time']
^blog ^$ [name='blog_index']
^admin/

The current path, blog/time/, didn't match any of these.

这是我的 Django 项目的布局:

我的 mysiteurls.py 文件如下所示:

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

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

我的 blog 包的 urls.py 文件如下所示:

from django.conf.urls import url
from blog import views

urlpatterns = [
    url(r'^time/$', views.today_is, name='todays_time'),
    url(r'^$', views.index, name='blog_index'),
]

我的博客包的views.py看起来像这样:

from django.http import HttpResponse
import datetime

def index(request):
    return HttpResponse("Hello Django!!!")

def today_is(request):
    now = datetime.datetime.now()
    html = '''
            <html>
                <body>
                    Current date and time: {0}
                </body>
            </html>
            '''.format(now)
    return HttpResponse(html)

我可以顺利去

http://127.0.0.1:8000/blog

并在我的浏览器中看到 index() 的响应为 "Hello Django!!!"。所以我期待

http://127.0.0.1:8000/blog/time/

工作得很好,但事实并非如此,并试图查看这就是产生我在上面分享的错误的原因。

谁能给我指明正确的方向?我会很感激!谢谢大家!

注意:我可以根据需要提供更多详细信息、屏幕截图或代码片段,请告诉我这里可能遗漏了什么!

您正在尝试访问 /blog/time 但您的 url 是博客/^time

urlpatterns = [
    #you have a carrot in here
    url(r'^time/$', views.today_is, name='todays_time'), 
    #it should be 
    url(r'time/', views.today_is, name='todays_time'),

]

这就是它找不到您的 url

的原因

如@LeLouch 所述,这是正确的:

url(r'time/', views.today_is, name='todays_time')

为什么用 ^ 开始你的正则表达式两次?你只能开始一次,结束一次。这就是它显示的原因:

^blog ^time/$ [name='todays_time']

当您删除 ^ 时,它只开始一次并且 不是两个开头和一个结尾 。在您的 blog.urls 中,您应该 继续正则表达式 。你打破 它用 两次使用 ^.

当您删除它时,它应该显示 ^blog/time/$^blog ^$ [name='blog_index'].

也是同样的问题

^(插入符号)是用于匹配字符串开头的正则表达式(正则表达式)。然而,它在 angular 的 404 页面中的显示方式有点奇怪。您会经常看到“^ ^”或插入符号 space 插入符号,以及在列出的 url 模式中重复出现的插入符号。从表面上看,这使得完全不可能匹配任何字符串,因为正如已经指出的那样,一个字符串不能从两个不同的地方开始。

发生的事情是 django 按层次顺序匹配事物,显示的模式为:

"^blog ^time/$"

以上实际上是两种模式:

"^blog"

然后:

"^time/$"

如果显示混乱,这是完全正常的,并且是此处处理 "include" 语句的预期方式。它只是没有以可见的分隔符显示。

要对此进行测试,请注意任何在第一部分中不匹配的包含指令都不会在 404 页面中展开。我在尝试让 rest-auth 包工作时注意到了这一点:

url(r'admin/', admin.site.urls, name='admin'),                     
url(r'^$', views.api_root, name='api_root'),
url(r'^auth/', include('rest_auth.urls')),
url(r'^auth/', include('rest_auth.registration.urls')),

如果我输入了以 "admin" 开头的 url,那么管理块会在 404 页面中展开显示,但我看不到什么 url 可能有效,如果从 "auth" 开始, 'auth' url 显示为空(虽然重复,因为有两个)。如果我输入以 "auth/" 开头的无效 URL,则会发生相反的情况。

您可能需要有多个子 url 模式才能看到这种效果。

Django 将在尝试匹配子 url 模式之前删除 url 的匹配部分。这就是为什么上面给出的看似不可能的 URL 模式可以匹配有效字符串的原因。

如果我不得不猜测它为什么不起作用,那可能是因为那里的第一个模式 ("^blog") 没有尾随的 "/",所以正确的 URL 会是 "blogtime/"。 (这与您提供的来源不符,您是否更改了什么?)

这可能不是您想要的。将尾随“/”添加到博客,并仔细检查 url 上的尾随 /,您可能就可以开始了。

顺便说一句,您确实需要结尾的“$”。它将阻止像 /blog/time/'drop table users;--' 这样的 url 解析。并不是说他们会做任何事情,我认为 django 在这一点上非常强大,但这仍然是一个很好的做法。我假设 django 会尝试将它们解析为传递给视图的参数,尽管我还没有对此进行调查。