Django基础二,URL路由分发

匿名 (未验证) 提交于 2019-12-02 23:49:02

一 URL配置

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

  基本格式

from django.conf.urls import url #循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数执行,就不再往下循环了,并给函数传一个参数request,和wsgiref的environ类似,就是请求信息的所有内容 from page import views # 从个人新建app中导入views模块 urlpatterns = [      url(正则表达式, views视图函数,参数,别名), ]

注意:

Django 2.0版本中的路由系统已经替换成下面的写法,但是django2.0是向下兼容1.x版本的语法的(官方文档):

from django.urls import path  urlpatterns = [     path('articles/2003/', views.special_case_2003),     path('articles/<int:year>/', views.year_archive),     path('articles/<int:year>/<int:month>/', views.month_archive),     path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail), ]

参数说明

  • views视图函数:一个可调用的对象
  • 参数:科员的要传递给视图函数额默认参数

    

二 正则表达式详解

  基本配置

from django.conf.urls import url  from . import views  urlpatterns = [     url(r'^articles/2003/$', views.special_case_2003), #思考:如果用户想看2004、2005、2006....等,你要写一堆的url吗,是不是在articles后面写一个正则表达式/d{4}/就行啦,网址里面输入127.0.0.1:8000/articles/1999/试一下看看     url(r'^articles/([0-9]{4})/$', views.year_archive),      url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), #思考,如果你想拿到用户输入的什么年份,并通过这个年份去数据库里面匹配对应年份的文章,你怎么办?怎么获取用户输入的年份啊,分组/(\d{4})/,一个小括号搞定     url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ]

  views.py中视图函数的写法:

第一个参数必须是request,后面跟的三个参数是对应着上面分组正则匹配的每个参数的 def article_detail(request,year,month,day):     return HttpResponse(year+month+day)

注意事项

  • urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
  • 若要冲URL中捕获一个值,只需要在它周围放置一对圆括号(分配分组)
  • 不需要添加一个前导的反斜杠(也就是写在正则最前面的那个/),因为每个url都有。例如:应该是^index而不是 ^/index。
  • 每个正则表达式前面的"r" 可选但是建议加上

补充说明

# 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项 APPEND_SLASH=True

Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。其效果就是:我们定义了urls.py:

from django.conf.urls import url from app01 import views  urlpatterns = [         url(r'^blog/$', views.blog), ]

三 分组命名匹配

无名分组

url(r'^books/(\d{4})/', views.books),

  位置参数

url(r'^books/(\d{4})/', views.year_books), #匹配年份的  url(r'^books/(\d{4})/(\d{1,2})/', views.year_month_books), #匹配年份和月份的  # http://127.0.0.1:8000/books/2001/  视图:  def year_month_books(request,year,month): #位置参数,第一个参数接收的就是无名分组路径中匹配 到的第一个分组的数据,第二个参数接收的就是无名分组路径中匹配到的第二个分组的数据      print(year,month)      # return render(request,'books.html')     return HttpResponse(year+month)

有名分组

url(r'^books/(?P<year>\d{4})/(?P<month>\d{1,2})/', views.year_month_books), #匹配年份和月份的  def year_month_books(request,month,year): #形参名称要和url中的分组名对应好,参数位置就没有要求 了      print(year,month)      # return render(request,'books.html')      return HttpResponse(year+month)

默认值

# urls.py中  from django.conf.urls import url   from . import views   urlpatterns = [      url(r'^blog/$', views.page),      url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ]  # views.py中,可以为num指定默认值  def page(request, num="1"):      pass

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!