Django框架的url路由规则系统(七)

一、 urls.py的作用(项目目录下的urls.py为根配置)

1、 URL配置(URL conf)就像是Django所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表。以这样的方式告诉Django,对于那个URL调用那段代码。url的加载就是从根配置文件中开始。
2、注意事项:

  • 当一个请求来到时,首先先到项目目录下的urls.py(根URLconf模块)中,查找相应的路由规则。在urls.py中urlpatterns是一个列表,它里面的每个元素就是一个路由规则。
  • 根配置模块中,里面定义了urlpatterns变量。
  • urlpatterns里面含有django.urls.path,django.urls.re_path对象。
  • 按顺序运行每个url路由规则,在被第一个匹配的url的规则(模式)匹配后停止。
  • 一旦匹配成功,django导入并且调用给定的视图。
  • 如果中间出错误或则没有匹配到相应的路由规则,返回404。

二、url(路由规则)例子

1、在项目目录下urls.py文件中写路由规则


2、在项目目录创建了一个views.py文件

3、在地址栏中输入url来进行访问django服务器
注意:只有当你输入的url跟后台配置的url一致才会调用url对应的视图函数。当地址为:127.0.0.1:8000/test/python

三、 path方法的基本规则(重点):

1、示例:path('test/<xx>/',views.test)

  • 使用尖括号(<>)从url中捕获值。包含一个转化器类型(converter type),将匹配任何字符串,当然也包括了 / 字符。
  • 当前面的url匹配成功后就会调用后面的视图函数。

2、基本格式:path(route,view,kwargs=None,name=None)

  • route:是一个字符串形式的url规则。
  • view:是一个视图函数。
  • kwargs:是一个额外参数,传递给view,必须是一个字典形式。
  • name:url的命名。

3、在url中捕获参数

  • 在url规则中可以使用'<对应视图函数的参数>'就可以捕获url中的值,传递给相应的视图函数。

4、类型转化器

  • 主要将捕获的url转化为相应的类型。

四、path方法中支持的转换器

  • str
    匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式。
  • int
    匹配正整数,包含0。
  • slug
    匹配字母、数字以及横杠、下划线组成的字符串。
  • uuid
    匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  • path
    匹配任何非空字符串,包含了路径分隔符。

五、转换器的使用

1、设置url路由规则:
path('test/<int:xx>/',views.test3)#指定被捕获的参数为整数类型。
2、在视图中将获取到的参数和参数的类型打印出来:

def test3(request,xx):

    print(xx,type(xx))

    return HttpResponse('hello %s'%xx)

注意:注意:xx名称必须要一致。
3、完整示例:

path('detail/<pk>-<slug>/', views.detail) #可以用-来连接,但是参数必须位置相同。
def detail(request, pk, slug):   
        return HttpResponse('这是第%s个学生,%s太坏了'% (pk, slug))

六、re_path方法的正则匹配

1、urls.py文件中的代码

re_path('^hello/$',views.test5),

re_path('^hello/(?P<yy>[0-9]+)/',views.test6),

2、views.py文件中的代码

def test5(request):

    return HttpResponse('这是用的re_path设置的')

def test6(request,yy):

    print(yy,type(yy))

    return HttpResponse('hello %s'%yy)

3、注意注意:

  • re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9]|1[0-2])/', views.students),当分了组就要和位置参数一一对应,不分组和关键字参数一一对应。
  • django的url只搜索路径部分,跟参数以及请求方法无关。

七、项目目录下和app下的urls.py

1、一个url对应一个视图函数,但我们的视图越来越多时,url也就越来越多。

2、include的作用:一个project有一个总的urls.py,各个app也可以自己建立自己的urls.py,用include()函数在project的urls.py文件进行注册。

3、include使用的例子如下:

  • 项目目录下的主urls.py
from django.contrib import admin
from django.urls import path,include
from . import views
urlpatterns = [ path('admin/', admin.site.urls), path('book/',include('book.urls')),] 
  • 为APP中books里面的urls.py
from django.urls import path

from . import views

urlpatterns = [ path('index/',views.index), ] 
  • 为APP中books里面的views.py
from django.http import HttpResponse
def index(request):
return HttpResponse('这个book的首页!!')

八、kwargs参数的作用

1、kwargs传递一个Python 字典作为额外的参数传递给视图函数。

# 主urls.py文件
from django.contrib import admin
from django.urls import path,include
urlpatterns = [ path('admin/', admin.site.urls), path('book/',include('book.urls'),{'switch':'true'}),]

2、Kwargs为字典类型可以传递额外的参数到views中使用,include的时候需要统一给下面的url一些参数的时候可以用此参数。并且视图函数中可以通过关键字参数获取到。

# 为APP中books里面的views.py
from django.http import HttpResponse
import datetime
def index(request,**kwargs):
    if kwargs.get('switch') == 'true':
        print(datetime.datetime.now())
    return HttpResponse('这个book的首页!!') 

3、注意事项

  • 在path,re_path方法中,可以向视图函数传递一个kwargs字典参数。
    当kwargs中的key与url捕获的key一致的时候,以kwargs中的key为主。
re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9]|1[0-2])/', views.students, kwargs={'swich': True})
ef students(request, year, month, swich):

        return HttpResponse('这是%s年%s月%s'% (year,month, swich))
  • 如果是在根配置urls.py中的话,即如下面所示:
urlpatterns = [ path('admin/', admin.site.urls), path('teacher/', include('teacher.urls'),kwargs={'swich': True})]

这样就会给teacher子应用的每条路由规则传一个{'swich': True}参数,有的时候业务需求要。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、前言 在django程序中,可以通过urls.py文件对所有的url进行任务的分配,URL配置(URLconf...
    NewForMe阅读 560评论 0 0
  • 若能避开猛烈的狂喜,自然也不会有悲伤的来袭。   URL配置(URLconf)就像Django 所支撑网站的目录。...
    一个无趣的人W阅读 684评论 0 1
  • 一,url路由path及转化器 URL(uniform Resoure Locator)统一资源定位符,是对可以从...
    木叶望将阅读 2,341评论 0 1
  • URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应。在Djan...
    汪菲宇阅读 720评论 0 0
  • 仇靖下了朝,和术冕商谈水运之事,宫女慌慌张张的跑来禀告。 “陛下,尘公子被顾大人带走了!” “什么!”仇靖一愣,微...
    木南思阅读 427评论 1 1