django入门菜鸟教程:路由层

2022年9月18日11:00:02后端程序开发评论60 views字数 1933阅读模式

django请求生命周期

django入门菜鸟教程:路由层

路由匹配

urlpatterns = [
    path('admin/', admin.site.urls),
]

path('网址后缀', 视图函数名)
    一旦网址后缀匹配上了 就会自动执行后面的函数 并结束整个陆游的匹配

1.路由结尾的斜杠
    默认情况下不写斜杠 django会做二次处理
    第一次匹配不上,django会让浏览器加上斜杠再次请求
    django配置文件中可以指定是否自动添加斜杠
        APPEND_SLASH = False
2.path转换器
    当网址后缀不固定时,可以使用转换器来匹配
    转换器类型: 
        'int': IntConverter(),
        'path': PathConverter(),
        'slug': SlugConverter(),
        'str': StringConverter(),
        'uuid': UUIDConverter(),
    路由:path('home/<str:name>/<int:pwd>/', views.home)
    视图函数:def home(request, name, pwd):
                pass
    转换器匹配到的内容会被当做视图函数的关键字参数传入,转换器有几个、叫什么名字,视图函数必须与其一一对应。
3.re_path 正则匹配
    re_path(正则表达式, 函数名)
    一旦网址后缀的正则能够匹配到内容就会立刻结束匹配,并执行后面的函数。例如:re_path('^home/$', views.home)
    当网址后缀不固定时,可以使用转换器来匹配
4.正则匹配之无名分组
    re_path('^home/(\d+)', views.home)
    正则表达式匹配到的内容会被当做视图函数的位置参数传递给视图函数
5.正则匹配之有名分组
    re_path('^home/(?P<name>\d+)/(?P<int>.*?)/')
    正则表达式匹配到的内容会被当做关键字参数传递给视图函数
6.django不同版本路由匹配的区别:
    django1.11版本中,只支持正则匹配,方法是url()
    django2、34中,支持转换器path(),也支持正则re_path(),等价于django1中的url()

反向解析

页面上提前写死了很多路由,一旦路由发生变化会导致所有页面相关链接失效,为了防止出现该问题,我们需要用到反向解析
'反向解析:返回一个结果,该结果可以访问到对应的路由'
路由对应关系可以起别名:
    path('register/', views.register, name = 'reg_view')
基于这个别名,我们就可以实现动态绑定路由

反向解析:
    1.urls.py
        path('register/', views.register, name = 'reg_view')
    2.html页面:
    {%  url 'reg_view'  %}
    3.views.py
    from django.shortcuts import reverse
        reverse('reg_view')
    只要路由别名不变,路由地址怎么变,都能访问到相应的地址


    ps:反向解析的操作三个路由匹配的语法都一样:
    path() re_path() url()

django入门菜鸟教程:路由层

无名有名反向解析

path('reg/<str:name>/<int:pwd>', views.reg, name='reg_view')
当路由中有不确定的匹配因素,反向解析的时候需要人为给出一个具体的值
reverse('reg_view', args=('jason',))
{%  url  'reg_view' 'jason'  %}
ps:反向解析的操作三个方法都一样path() re_path() url()

路由分发

django中的应用都可以拥有自己独立的static、templates、文件夹,以及urls.py文件
能够让每个python程序员只专注于自己那一部分的app的开发,各个应用完全独立,便于小组开发

总路由:
    path('app01/', include('app01.urls')),
    path('app02/', include('app02.urls'))
子路由:
    path('after/', views.after)  # app01
    path('after/', views.after)  # app02

django入门菜鸟教程:路由层

名称空间

有路由分发的场景下多个应用在涉及到反向解析别名冲突时,无法正常解析
解决方式:
    1.名称空间 namespace
    path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
    path('app01/', include(('app01.urls', 'app02'), namespace='app02'))
    2.别名不冲突即可:保证django项目下没有重复的路由别名

作者:爱新觉罗吉星
来源:稀土掘金

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/27817.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定