• django3-路由系统进阶


    1.django的url到底是什么

      就是路径 ,看成django的目录 ,每个目录对应个视图函数 ,当然一个url仅能对应一个函数

    2.url的格式 

      url(正则表达式,views函数名,参数,别名)

      这里的正则表达式有个问题就是可能会匹配到多个路径 ,匹配的方式是从上到下匹配即停 ,所以正则一定要严谨防止截胡

      斜线' / '末尾加上会好很多,开头不用加

    #urls.py
    from app01 import views   #加载应用的地址函数模块
    from app02 import views as app02views  #这里一个问题就是不同应用的同名文件可以使用as来取别名
    urlpatterns = [
        url(r'^admin/$', admin.site.urls),
        url(r'^admin/add/', admin.site.urls),
        url(r'^admin/del/', admin.site.urls),
        url(正则表达式,views函数,参数,别名),
    ]

    3.路由分发

      场景: 当app过多所有的url都写在项目目录下的urls.py肯定是不行 ,所以要在每个app下都创建一个urls.py分发到各个app下即可 ,使用的是include函数做路由分发

    #/项目目录下/urls.py
    from django.conf.urls import url,include
    from django.contrib import admin
    from app1 import views

    urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login),
    url(r'^app1/', include('app1.urls')),
    ]

    #/app1/urls.py
    from django.conf.urls import url
    from app1 import views

    urlpatterns = [
    url(r'^press/list', views.presslist),
    url(r'^press/del', views.pressdel),
    url(r'^press/add', views.pressadd),
    url(r'^press/edit/', views.pressedit),
    ]

    4.分组与命名分组

      分组是在做什么? 我们传参可以使用get中的url携带参数 ,我们还能用分组直接获得参数传给视图函数 ,方便了不少呢

      1).分组(肯定是正则的分组, 一组一个参数 ,参数仅仅能传递str类型)

    #urls.py中

      url(r'^press/del/(d+)/', views.pressdel),    #使用正则匹配一个分组

    #views.py中
        def pressdel(request, del_id):           #接收url中的位置参数
    models.presslist.objects.get(pk=del_id).delete()
    return redirect('/app1/press/list')
    #html中
       <a>href="/app1/press/del/{{ obj.pk }}/"><i class="fa fa-remove" aria-hidden="true"></i></a>    #点击时可以触发url

      2).命名分组 ,和分组的区别就是使用的是关键字参数 ,可以不考虑顺序传递参数了

    #urls.py中
    
      url(r'^press/del/?P<del_id>(d+)/', views.pressdel),    #使用正则匹配一个分组
    
    #views.py中
        def pressdel(request, del_id):           #接收url中的位置参数
            models.presslist.objects.get(pk=del_id).delete()
            return redirect('/app1/press/list')
    #html中
       <a>href="/app1/press/del/{{ obj.pk }}/"><i class="fa fa-remove" aria-hidden="true"></i></a>    #点击时可以触发url

      3).命名分组之默认值分组 ,默认值分组的意义是什么? 访问不带参数时的默认值 ,如下面的情况

    #urls.py文件
       url(r'^blog/page/$', views.blog),      #访问首页没有参数的时候 ,视图函数中num=9999
       url(r'^blog/page/(?P<num>[0-9]{1,2})', views.blog),  #访问带页码的参数时 ,视图函数会使用分组中的num值
    #views.py
    def blog(request,num='9999'):

    5.路由的别名

      场景: 重新规划了一下urls中的正则匹配地址 ,此时视图函数与模板中写死的跳转就都变了 ,那么改动实在太多了 ,使用路由别名! 每个url的正则无论如何变化 ,他的别名都不会变化

      1).静态别名 ,就是url中没有携带参数(反向解析就是仅关注别名 ,别名后面如何不用管这就是反向解析)

        视图函数中使用reverse()函数解析 ,模板中使用{% url '别名' %}解析

    # urls.py文件
    url(r'^halias/$', views.halias, name='hs'),
    url(r'^ralias/$', views.ralias, name='rs'),
    
    
    # views.py文件的redirect
    def halias(request):
        return render(request, 'test.html')
    
    
    def ralias(request):
        return redirect(reverse('rs'))
    
    # html文件
    < a href = "{% url 'hs' %}" > 刷新操作 < / a >   

      2).动态别名 ,就是url中夹带了参数 ,反向解析的时候有点不同 ,其中分为参数为位置参数或者是关键字参数

    ####位置参数解析
    #
    urls.py文件 url(r'^halias/([0-9]{1,2})/(..)/$', views.halias,name='hs'), #在views.py文件redirect(reverse) def halias(request,c1,c2): if c1 == '1': return redirect(reverse('hs',args=('34','op'))) return render(request,'test.html',{'c1':c1,'c2':c2}) #在html文件 <a href="{% url 'hs' '12' '12' %}">刷新操作</a>


    ####关键字参数解析
    #urls.py文件 url(r'^halias/([0-9]{1,2})/(..)/$', views.halias,name='hs'), #在views.py文件redirect(reverse) def halias(request,c1,c2): if c1 == '1': return redirect(reverse('hs',kwargs={c1:'34',c2:'op'})) return render(request,'test.html',{'c1':c1,'c2':c2}) #在html文件 <a href="{% url 'hs' c1='12' c2='12' %}">刷新操作</a>

    6.路由命名空间

      场景: 反向解析虽然好用, 但是如果多个app下出现了重名的解析name模板与视图中怎么办?到底解析哪一个? 使用命名空间 ,在跟urls.py的文件中设定命名空间

    #project/urls.py文件
    urlpatterns = [
        url(r'^app01/', include('app01.urls',namespace='ap1')),
        url(r'^app02/', include('app02.urls',namespace='ap2')),
    ]
    #html文件引入别名改动
    <p>
        <a href="{% url 'ap1:ns' 参数1 参数2... %}">命名空间测试刷新当前页</a>
    </p>
    #views.py重定向使用别名时
    ....
        return redirect(reverse('ap1:cbs',arg...))
    ...

    7.url相关规范

      1)路由要在跟路由处完成分发 ,避免路由表过大

      2)路由分发时标注命名空间 ,防止不同app下有重名路由

      3)每个app下每条路由都要有别名 ,防止url变化引起大规模改动

  • 相关阅读:
    Array
    StringBuffer
    String
    字节流
    正则表达式
    coursera 机器学习 linear regression 线性回归的小项目
    立个FLAG!
    排序题目练习(Ignatius and the Pincess IV、排序、Clock、排名)
    codeforces 1006
    codeforces
  • 原文地址:https://www.cnblogs.com/quguanwen/p/11382520.html
Copyright © 2020-2023  润新知