首先让我说我是Django的新手,我意识到这似乎很简单(我希望它是这样)。
我正在关注一个教程,它带我完成了一个简单的Django网站的基本设置,我发现自己陷入了一个问题,我只是在调用一个新的视图,教程只是让我添加。 (对于那些感兴趣的人,教程在这里https://overiq.com/django/1.10/views-and-urlconfs-in-django/)
所以,我已经启动并运行了我的服务器,并且我正在尝试访问
当我尝试访问该视图时,出现错误:
使用mysite.urls中定义的URLconf,Django尝试了这些URL 模式,按此顺序:
^blog ^time/$ [name='todays_time'] ^blog ^$ [name='blog_index'] ^admin/
当前路径blog / time /与其中任何一个都不匹配。
这是我的Django项目的布局:
我的 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)
我可以成功进入
并将index()的响应视为“Hello Django !!!”在我的浏览器中。因此,我期待
工作正常,但它没有,并试图查看这是产生我上面分享的错误的原因。
有人能指出我在正确的方向吗?我很感激!谢谢大家!
注意:我可以根据需要提供更多详细信息,屏幕抓取或代码段,请告诉我这里可能缺少的内容!
答案 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会尝试将它们解析为传递给视图的参数,尽管我没有对此进行调查。