Django 网址帮助 - 无法访问视图
Django urls help - not able to access view
首先让我说我是 Django 的新手,我意识到这看起来很简单(我希望如此)。
我正在按照一个教程指导我完成一个简单 Django 站点的基本设置,但我发现自己卡在了一个点上,我只是简单地调用教程刚刚包含的一个新视图我加。 (有兴趣的可以看这里https://overiq.com/django/1.10/views-and-urlconfs-in-django/)
所以,我的服务器已经启动 运行,我正在尝试访问
当我尝试访问该视图时,出现错误:
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 项目的布局:
我的 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),
]
我的 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)
我可以顺利去
并在我的浏览器中看到 index() 的响应为 "Hello Django!!!"。所以我期待
工作得很好,但事实并非如此,并试图查看这就是产生我在上面分享的错误的原因。
谁能给我指明正确的方向?我会很感激!谢谢大家!
注意:我可以根据需要提供更多详细信息、屏幕截图或代码片段,请告诉我这里可能遗漏了什么!
您正在尝试访问 /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 会尝试将它们解析为传递给视图的参数,尽管我还没有对此进行调查。
首先让我说我是 Django 的新手,我意识到这看起来很简单(我希望如此)。
我正在按照一个教程指导我完成一个简单 Django 站点的基本设置,但我发现自己卡在了一个点上,我只是简单地调用教程刚刚包含的一个新视图我加。 (有兴趣的可以看这里https://overiq.com/django/1.10/views-and-urlconfs-in-django/)
所以,我的服务器已经启动 运行,我正在尝试访问
当我尝试访问该视图时,出现错误:
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 项目的布局:
我的 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),
]
我的 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)
我可以顺利去
并在我的浏览器中看到 index() 的响应为 "Hello Django!!!"。所以我期待
工作得很好,但事实并非如此,并试图查看这就是产生我在上面分享的错误的原因。
谁能给我指明正确的方向?我会很感激!谢谢大家!
注意:我可以根据需要提供更多详细信息、屏幕截图或代码片段,请告诉我这里可能遗漏了什么!
您正在尝试访问 /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 会尝试将它们解析为传递给视图的参数,尽管我还没有对此进行调查。