首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Django基础核心技术介绍(2):URL的设计与配置

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。今天小编我就来给你来介绍下第二项Django核心基础知识之URL的设计与配置吧。想持续了解后续Django Web开发技术请订阅我的公众号【Python与Django大咖之路】。

Django的URL是如何工作的

URL通常与视图(View)一起工作的。服务器收到用户请求后,会根据urls.py里的关系条目,去视图View里查找到与请求对应的处理方法,从而返回给客户端http页面数据。这和其它web开发的路由机制(Router)是一个道理。如果你还不知道视图是什么,那么你只需要记住:视图收到用户的请求后,展示给用户看得见的东西。

我们来看看下面一个新闻博客的例子:

# blog/urls.py

fromdjango.urlsimportpath

from.importviews

urlpatterns = [

path('blog/',views.index),

path('blog/article//',views.article),

]

# blog/views.py

defindex(request):

# 展示所有文章

defarticle(request,id):

# 展示某篇具体文章

那么这段代码是如何工作的?

当用户在浏览器输入/blog/时,URL收到请求后会调用视图views.py里的index方法,展示所有文章。

当用户在浏览器输入/blog/article//时,URL不仅调用了views.py里的article方法,而且还把参数文章id通过括号的形式传递给了视图。int这里代表只传递整数,传递的参数名字是id。

注意当你配置URL时,别忘了把你的app(比如blog)urls加入项目的URL配置里(mysite/urls.py), 如下图所示:

Django URL传递参数的方法path和_re_path

写个URL很简单,但如何通过URL把参数传递给给视图view是个技术活。Django URL提供了两种匹配方式传递参数:path和re_path。path是正常参数传递,re_path是采用正则表达式regex匹配。path和re_path传递参数方式如下:

path方法:采用双尖括号或传递,例如, 或。

re_path方法: 采用命名组(?P表达式)的方式传递参数。

下图两种传递文章id给视图函数的方式是一样的。re_path里引号前面的小写r表示引号里为正则表达式, 请忽略'\'不要转义,^代表开头,$代表以结尾,\d+代表正整数。

# blog/urls.py

fromdjango.urlsimportpath,re_path

from.importviews

urlpatterns = [

path('blog/article//',views.article,name='article'),

re_path(r'^blog/article/(?P\d+)/$',views.article,name='article'),

]

# View (in blog/views.py)

defarticle(request,id):

# 展示某篇文章

URL的命名及reverse()方法

你注意到没?我们在上述代码中还给URL取了一个名字 'article'。这个名字大有用处,相当于给URL取了个全局变量的名字。它可以让你能够在Django的任意处,尤其是模板内显式地引用它。假设你需要在模板中通过链接指向一篇具体文章,下面那种方式更好?

方法1: 使用命名URLArticle

方法2: 使用常规URL - 不建议Article

如果你还没意识到方法1的好处,那么想想吧,假设你需要把全部模板链接由blog/article/id改为blog/articles/id, 那种方法更快?改所有模板,还是改URL配置里的一个字母?

可惜的是命名的URL一般只在模板里使用,不能直接在视图里使用。如果我们有了命名的URL,我们如何把它转化成常规的URL在视图里使用呢?Django提供的reverse()方法很容易实现这点。假设不同的app(比如news和blog)里都有article这个命名URL, 我们怎么区分呢? 我们只需要在article前面加上blog这个命名空间即可。

fromdjango.urlsimportreverse

# output blog/article/id

reverse('blog:article',args=[id])

URL如何指向基于类的视图(View)

目前path和re_path都只能指向视图view里的一个函数或方法,而不能指向一个基于类的视图(Class based view)。Django提供了一个额外as_view()方法,可以将一个类伪装成方法。这点在当你使用Django在带的view类或自定义的类时候非常重要。具体使用方式如下:

# blog/urls.py

fromdjango.urlsimportpath,re_path

from.importviews

urlpatterns = [

path('',views.ArticleList.as_view(),name='article_list'),

path('blog/article//',views.article,name='article'),

re_path(r'^blog/article/(?P\d+)/$',views.article,name='article'),

]

# View (in blog/views.py)

fromdjango.views.genericimportListView

from.viewsimportArticle

classArticleList(ListView):

queryset = Article.objects.filter(date__lte=timezone.now()).order_by('date')[:5]

context_object_name ='latest_article_list'

template_name ='blog/article_list.html'

defarticle(request,id):

# 展示某篇文章

通过URL方法传递额外的参数

在你配置URL时,你还可以通过字典的形式传递额外的参数给视图, 而不用把这个参数写在链接里。如下面案例所示:

# blog/urls.py

fromdjango.urlsimportpath,re_path

from.importviews

urlpatterns = [

path('',views.ArticleList.as_view(),name='article_list',{'blog_id':3}),

re_path(r'^blog/article/(?P\d+)/$',views.article,name='article'),

]

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180509G0IGLM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券