Django URL映射

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访问您的视图即可。

组织您的URL

到目前为止,我们在“myprojects/url.py”文件中创建了URL,但正如前面所述关于Django和创建应用程序,最好的方法是能够在不同项目中重复使用应用程序。您可以很容易地看到问题所在,如果您将所有URL保存在“projecturl.py”文件中。因此,最佳做法是为每个应用程序创建一个“url.py”,并将其包含在我们主要项目的url.py文件中(我们之前包含了admin界面的admin URL)。

Django 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应用程序的所有URL。之前通过“/hello”访问的home.html现在是“/myapp/hello”,这是一个更好和更易理解的Web应用程序结构。

Django URL映射

现在,让我们假设在我的应用程序中有另一个视图“morning”,并且我们希望在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 元组的第一个元素。当您想要更改您的应用程序名称时,这可能会很有用。

Django URL映射

向视图发送参数

我们现在知道如何映射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视图,在浏览器中你应该看到以下结果−

Django URL映射

请注意这里参数的顺序很重要。假设我们想要获取一年中某个月的文章列表,让我们添加一个名为viewArticles的视图。我们的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”,但是如果你反转参数,你将不能得到相同的结果。

Django URL映射

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程