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

时间:2018-01-31 03:35:50

标签: python django django-views django-urls

首先让我说我是Django的新手,我意识到这似乎很简单(我希望它是这样)。

我正在关注一个教程,它带我完成了一个简单的Django网站的基本设置,我发现自己陷入了一个问题,我只是在调用一个新的视图,教程只是让我添加。 (对于那些感兴趣的人,教程在这里https://overiq.com/django/1.10/views-and-urlconfs-in-django/

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

  

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

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

  

使用mysite.urls中定义的URLconf,Django尝试了这些URL   模式,按此顺序:

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

当前路径blog / time /与其中任何一个都不匹配。

这是我的Django项目的布局:

Django project layout

我的 mysite urls.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),
]

我的博客包的 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/

工作正常,但它没有,并试图查看这是产生我上面分享的错误的原因。

有人能指出我在正确的方向吗?我很感激!谢谢大家!

注意:我可以根据需要提供更多详细信息,屏幕抓取或代码段,请告诉我这里可能缺少的内容!

3 个答案:

答案 0 :(得分:1)

您尝试访问/博客/时间,但您的网址是博客/ ^时间

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'),

]

这就是为什么它无法找到你的网址

答案 1 :(得分:1)

这是正确的,因为@LeLouch提到:

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

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

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

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

删除后,应显示^blog/time/$。 同样的问题是^blog ^$ [name='blog_index']

答案 2 :(得分:0)

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

django发生了什么事情,就是按层次结构顺序匹配事物,并且模式显示为:

"^blog ^time/$"

实际上是两个模式:

"^blog"

然后:

"^time/$"

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

要对此进行测试,请注意,在第一部分中未匹配的任何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”开头,则在404页中将显示admin块,但如果以“ auth”开头,我看不到哪些网址可能有效,并且“ auth”网址是显示为裸露(尽管重复,因为其中有两个)。如果我输入以“ auth /”开头的无效URL,则会出现相反的情况。

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

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

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

那可能不是您想要的。将结尾的“ /”添加到博客中,然后仔细检查URL上的结尾的/,您可能会很高兴。

顺便说一句,您确实希望尾随“ $”。它将阻止解析/ blog / time /'drop table users;-'之类的网址。并不是说他们会做任何事情,我认为django在这一点上非常强大,但这仍然是一个好习惯。我认为django会尝试将它们解析为传递给视图的参数,尽管我没有对此进行调查。