二十五岁时我们都一样愚蠢、多愁善感,喜欢故弄玄虚,可如果不那样的话,五十岁时也就不会如此明智。
标题:Django URL映射
现在我们已经有了前面章节解释过的工作观点。我们希望通过URL访问该视图。Django有自己的URL映射方式,它通过编辑项目url.py文件 (myproject / url.py) 来完成 。url.py文件看起来像 -
from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', #Examples #url(r'^$', 'myproject.view.home', name = 'home'), #url(r'^blog/', include('blog.urls')), url(r'^admin', include(admin.site.urls)), )当用户在您的Web应用程序上发出页面请求时,Django控制器会通过url.py文件继续查找相应的视图,然后返回HTML响应或404未找到的错误(如果未找到)。在url.py中,最重要的是 “urlpatterns” 元组。这是您定义URL和视图之间映射的地方。映射是URL模式中的元组,例如 -
from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', #Examples #url(r'^$', 'myproject.view.home', name = 'home'), #url(r'^blog/', include('blog.urls')), url(r'^admin', include(admin.site.urls)), url(r'^hello/', 'myapp.views.hello', name = 'hello'), )标记的线将URL“/ home”映射到在myapp / view.py文件中创建的hello视图。正如你在上面看到的,映射由三个元素组成 -
模式 - 匹配您想要解析的URL和地图的正则表达式。 所有可以与python're'模块一起工作的模式都适用于模式(当你想通过url传递参数时很有用)。
视图的Python路径 - 与导入模块时相同。
名称 - 为了执行URL反转,您需要使用上述示例中的命名URL模式。 完成后,只需启动服务器即可通过以下网址访问您的视图:http://127.0.0.1/hello
组织您的网址
到目前为止,我们已经在“myprojects / url.py”文件中创建了URL,但是如前所述,关于Django和创建应用程序,最好的方式是能够在不同的项目中重用应用程序。如果要将所有网址保存在“projecturl.py”文件中,则可以轻松查看问题所在。所以最好的做法是为每个应用程序创建一个“url.py”,并将其包含在我们的主要项目url.py文件中(我们之前包括管理界面的管理URL)。
它是如何完成的?
我们需要使用以下代码在myapp中创建一个url.py文件 -
from django.conf.urls import patterns, include, url urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)然后myproject / url.py将更改为以下内容 -
from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', #Examples #url(r'^$', 'myproject.view.home', name = 'home'), #url(r'^blog/', include('blog.urls')), url(r'^admin', include(admin.site.urls)), url(r'^myapp/', include('myapp.urls')), )我们已经包含myapp应用程序中的所有网址。通过“/ hello”访问的home.html现在是“/ myapp / hello”,这是一个更好,更易于理解的Web应用程序结构。
现在让我们想象我们在myapp“早上”有另一个视图,我们想将它映射到myapp / url.py中,然后我们将myapp / url.py更改为 -
from django.conf.urls import patterns, include, url urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'), url(r'^morning/', 'myapp.views.morning', name = 'morning'), )这可以重新考虑到 -
from django.conf.urls import patterns, include, url urlpatterns = patterns('myapp.views', url(r'^hello/', 'hello', name = 'hello'), url(r'^morning/', 'morning', name = 'morning'),)正如你所看到的,我们现在使用我们的 urlpatterns 元组的第一个元素。当你想改变你的应用程序名称时,这会很有用。
将参数发送到视图
我们现在知道如何映射URL,如何组织它们,现在让我们看看如何将参数发送到视图。典型示例是文章示例(您想通过“/ articles / article_id”访问文章)。
传递参数是通过使用URL模式中的正则 表达式 捕获它们来完成的。如果我们在“myapp / view.py”中拥有如下所示的视图
from django.shortcuts import render from django.http import HttpResponse def hello(request): return render(request, "hello.html", {}) def viewArticle(request, articleId): text = "Displaying article Number : %s"%articleId return HttpResponse(text)我们希望将它映射到myapp / url.py中,以便通过“/ myapp / article / articleId”访问它,我们需要在“myapp / url.py”中使用以下内容 -
from django.conf.urls import patterns, include, url urlpatterns = patterns('myapp.views', url(r'^hello/', 'hello', name = 'hello'), url(r'^morning/', 'morning', name = 'morning'), url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)当Django将会看到url:“/ myapp / article / 42”时,它会将参数'42'传递给viewArticle视图,并且在浏览器中你应该得到以下结果 -
请注意,参数的顺序在这里很重要。假设我们想要一年中一个月的文章列表,我们添加一个viewArticle视图。我们的view.py变成 -
from django.shortcuts import render from django.http import HttpResponse def hello(request): return render(request, "hello.html", {}) def viewArticle(request, articleId): text = "Displaying article Number : %s"%articleId return HttpResponse(text) def viewArticle(request, month, year): text = "Displaying articles of : %s/%s"%(year, month) return HttpResponse(text)相应的 url.py 文件看起来像 -
from django.conf.urls import patterns, include, url urlpatterns = patterns('myapp.views', url(r'^hello/', 'hello', name = 'hello'), url(r'^morning/', 'morning', name = 'morning'), url(r'^article/(\d+)/', 'viewArticle', name = 'article'), url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)现在,当您进入“/ myapp / articles / 12/2006 /”时,您将会看到“显示2006/12年的文章”,但是如果您反转这些参数,您将得不到相同的结果。
为了避免这种情况,可以将URL参数链接到视图参数。为此,我们的 url.py 将变成 -
from django.conf.urls import patterns, include, url urlpatterns = patterns('myapp.views', url(r'^hello/', 'hello', name = 'hello'), url(r'^morning/', 'morning', name = 'morning'), url(r'^article/(\d+)/', 'viewArticle', name = 'article'), url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)