zoukankan      html  css  js  c++  java
  • Diango路由控制

     路由的格式:

    #路由配置的格式:
    urls.py里面写
    
    from diango.conf.urls import url
    
    urlpatterns = [
             url(正则表达式,views视图函数,name)     
    
    ]
    

    一:无名分组

    路由urls.py的配置

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
        #没有参数
        #d+ 后面可以匹配一个或无穷个数字的访问格式:例如http://127.0.0.1:8000/test2/12345
        url(r'^test2/d+$', views.test2),
    
        #一个分组:(d+),对应视图层就要1个参数接收对应分组
        #(d+) 也是匹配后面一个或无穷个数字的访问格式(但是括号本身还是一个参数,对应视图里面的视图函数要接收这个参数)
        url(r'^test3/(d+)', views.test3),  #视图函数里面就可以直接拿到这个后面输入的参数值
    
        #3个分组:([0-9]{4})..,对应视图层就要3个参数接收对应分组
        url(r'^test4/([0-9]{4})/([0-9]{2})/([0-9]{1})/$', views.test4),  # 加括号就可以拿到浏览器中输入的值
    
    ]

    相对上面路由,views.py视图里面的配置

    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    def test1(request):
        return HttpResponse('test1')
    
    #不需要传入参数
    def test2(request):
        return HttpResponse('test2')
    
    #需要传入1个参数
    def test3(request,num):
        print(num)
        return HttpResponse('test3'+num)
    
    #需要传入3个参数
    def test4(request,y,m,d):
        print(y,m,d)
        return HttpResponse('对于路由传入多个参数的响应:  %s年 %s月 %s日'%(y,m,d))

     注意的点就是:

      1.第一个参数,可以写一个正则表达式

      2.urls.py里面有多个路由条目,一旦匹配成功就不往下走了

      3.如果路由url里面分了几个组,响应的views视图函数里面就应该有几个参数来接收

      4.在settings里设置:APPEND_SLASH=False,请求时,浏览器不会自动补全斜杠,这样当你浏览器输入时后面没有加斜杠(与你url路由里面的不符就会报错)

    settings.py里面关于APPEND_SLASH=False的说明

    from django.conf.urls import url
    from app01 import views
    
    urlpatterns = [
            url(r'^blog/$', views.blog),
    ]
    
    访问 http://www.example.com/blog 时,默认将网址自动转换为 http://www.example/com/blog/ 
    
    如果在settings.py中设置了 APPEND_SLASH=False,此时我们如果输入后面没有加斜杠http://www.example.com/blog 时就会匹配失败,提示找不到页面。
    

    二:伪静态页面

    有些.html结尾的网页大多数都是伪静态页面,就是为了百度seo收录(如果变动的百度的收录会特别低,百度数据库里面很难收录你的信息,收录权限比较低,为了让百度提高收录权限)

    例如:其实后面的数字就是你访问某个网站具体资源对应的id

    正常对应的动态访问地址: (这里是指举例,可能对应的字段名不一定是id)

    静态网页与动态网页之间的转换简单实现:

    #静态网页
        url(r'^test5/(d+).html', views.test5)
    

    三:有名分组

     #有名分组:路由设置
        url(r'^test6/(?P<year>[0-9]{4})/(?P<month>[0-9]{2}/(?P<day>[0-9]{1}))', views.test6),
    
    #视图设置:views.py
    def test6(request,year,month,day,):
        print(year,type(year))
        print(month)
        print(day)
        return HttpResponse('有名分组,接收年月日三个参数')

    有名分组注意点:

    1.名字必须一致,否则报错,位置可以颠倒,如果分了两个组,必须用两个参数连接

    2.有名分组和无名分组不要混用

    3.有名分组可以用**kwargs接收,无名分组可以用*args接收

    4.分组捕获的单数,都是str类型

    5.可以设置默认值

    *args接收多个无名路由 与 **kwargs接收多个有名路由:

    无名路由分组:
    url(r'^test4/([0-9]{4})/([0-9]{2})/([0-9]{1})/$', views.test4)
    
    无名视图接收方式一:
    def test4(request,y,m,d):
        print(y,m,d)
        return HttpResponse('对于路由传入多个参数的响应:  %s年 %s月 %s日'%(y,m,d))
    
    无名视图接收方法二:
    def test4(request,*args):
        print(args,type(args)) #元组格式       #('2001', '10', '3') <class 'tuple'>
        return HttpResponse('无名路由传入多个参数的响应')
    
    
    
    
    
    有名路由分组:
    url(r'^test6/(?P<year>[0-9]{4})/(?P<month>[0-9]{2}/(?P<day>[0-9]{1}))', views.test6),
    
    有名视图接收方式一:
    def test6(request,month,day,year):
        print(year,type(year))
        print(month)
        print(day)
        return HttpResponse('有名分组,接收年月日三个参数')
    
    有名视图接收方法二:
    def test6(request,**kwargs):
        print(kwargs,type(kwargs)) #字典格式  #{'year': '2018', 'month': '12/4', 'day': '4'} <class 'dict'>
    
        return HttpResponse('有名分组,接收年月日三个参数')
    有名路由、无名路由视图的2种接收方法

    四:路由分发

     路由分发:即目录中建了多个app文件,每个app里面都有自己的urls.py及views.py,这时候就要用到路由分发,先在总的路由里面匹配url地址的前面一部分,再指向每个app里面的url里面去找。

    注意:总的urls.py里面url地址后面不能写$,如果写了匹配到时就会结束,不会继续往下面对应的app进行路由分发

    第一步:总路由里面导入include模块  (哪里做分发就在哪里导入)

      from django.conf.urls import include

    第二步:在相应的app里面也建立自己的urls.py文件  (回忆:manage.py startapp app02 命令方式创建app文件夹)

    第三步:在总路由里面进行分发(建议不要改名字)

        方式一:  url(r'^app01/',include(urls)), 这种上面要实现做导入 例如:from app01 import urls

        方式二:url(r'^app01/',include('app01.urls')) (推荐使用这一种)

    """day05 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/1.11/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.conf.urls import url, include
        2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
    """
    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    from django.conf.urls import url,include
    from app02 import urls
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
        #路由的分发
    
        #方式一:指定分发的二级路由 app02.urls,
        #原理:例如http://127.0.0.1:8000/app02/test/  这样一个请求先http://127.0.0.1:8000/app02 这部分做完匹配,后面/test/再去app02.urls里面找函数体
        url(r'^app02/', include('app02.urls')),  #分发给app02
        #同理:分发给app01
        # url(r'^app01/', include('app01.urls')),
    
        #方式二:注意实现要先导入路由对应的urls ,才能直接调用,例如:from app02 import urls
        # url(r'^app01/', include(urls)),
    
    
    ]

    第四步:在指定分发的app的urls.py里面urlpatterns不能变名字,里面url地址写法就一样了

    重复上面的步骤可以分发多个路由

    五:1.0与2.0区别

     Django2.1版本的分发,用的是re.path模块相当与1.1的url,多了个path不支持正则

    #主urls
    from django.urls import path,re_path,include
    from app01 import views
    
    from app01 import urls
    urlpatterns = [ 
      # re_path(r'^app01/',include('app01.urls')),#行
      # re_path(r'^app01/&',include('app01.urls')),#不行
      # path('app01/',include('app01.urls')),#行 
      #path('app01/', include(urls)),   #不支持正则
    
    ]
    
    #在app01里面创建urls
    from django.urls import path,re_path
    from app01 import views
    urlpatterns = [
        re_path(r'^test/(?P<year>[0-9]{2})/$',views.url_test),
    ]

    Django1.1用的是url

    from django.conf.urls import url,include
    
    #主路由的配置
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        
        #方法一:
        # url(r'^app01/',include(urls)),  
        #方法二:
        url(r'^app01/',include('app01.urls'))
    
    ]
    
    #app01里面urls.py的设置
    from django.conf.urls import url,include
    from app01 import views    #这个视图views是app01自己的目录下面的
    urlpatterns = [
        url(r'^test01',views.test01)
    
    ]

    path的应用:

    1.可以指定参入参数的类型,(int只能匹配数字)

    2.格式,<参数1:参数2>   参数1:转换器的名字   参数2:参数名

    3.不支持正则,精准匹配

    4.自定义转换器:(1)写个类  (2)导入register_converter (3)register_converter(test,'ttt') (4)path...

    支持的5种类型转换:

    str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式

    int,匹配正整数,包含0。

    slug,匹配字母、数字以及横杠、下划线组成的字符串。

    uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。

    path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?

    自定义转化器:

    注意regex、to_python、to_url 名字都是固定写法,不能改

     

    %04d:是指输入的不够4位前面补0,例如输入1:会不全为0001

    必须导入这个进行注册:

     

    视图里面的配置:

    六:反向解析

    路由中的设置 ,命一个名: url(r'^index/', views.index,name='n1'),

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
        #实现通过访问test能拿到index地址,完成时时跳转
        url(r'^test', views.test),
        #给index路由定义一个变量name,绑定给test函数
        url(r'^index2222/',views.index,name='jiexi')
    
    ]

    视图函数的设置:其他函数取绑定这个路由定义的名字,从而时时解析出

      from diango.shortcuts import reverse

      这样就拿到了对应绑定路由的地址

      url=reverse('n1')

    #导入reverse模块
    from django.shortcuts import render,HttpResponse,redirect,reverse
    
    让test这个函数绑定index路由,实现当访问test网站时会自动跳转到index的网站(index地址的变化就没有影响了)
    def test(request):
        #这里通过名字jiexi可以直接拿到index地址
        url=reverse('jiexi')  #和urls视图里面定义的变量值一样 url(r'^test7/',views.test7,name='jiexi')
        print(url)  #输出的就是url(r'^index/',views.index,name='jiexi'),里面的写的地址的地址 /index/
    
        # return HttpResponse('验证反向解析效果')
    
        #正常情况下跳转
        # return redirect('/index/') 正常情况下跳转
    
        #绑定了index路由里面定义的名字以后就可以,拿到了index的地址,就可以直接通过地址跳转
        return redirect(url)
    
    #index的界面内容,实现在地址r'^index2222/'变动的情况下,外面也可以正常访问进来
    def index(request):
        return HttpResponse('index界面')

    输出结果变化:

    当输入test地址的时候:

    点击回车,会自动跳转到index界面:

    pycharm界面输出:

    图解如下:

    1.路由中,

    2.在视图函数里:

      from diango.shortcuts import reverse

      这样就拿到了我反向解析出来的url

      url=reverse('n1')

    3.在模板里用

      {% url 'n1'%}

    实例2:带传参数的解析绑定的路由,就是如下举例:

    总结:1 在html代码里{% url "别名" 参数  参数%}

       2 在视图函数中:

        2.1 url=reverse('test')

        2.2 url=reverse('test',args=(10,20))

    图解如下:

    路由设置:

     视图设置:

    效果就是点test输入的时候:

    就会完成跳转到index:

    4 带位置参数反向解析 url(r'^index/([0-9]{4})/([0-9]{2})', views.index,name='n1'),
    视图:url=reverse('n1',args=(2012,12,))

    模板:{% url 'n1' 2012 12 %}

    5 带关键字参数反向解析 url(r'^index/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.index,name='n1'),
    视图:url=reverse('n1',args=(2012,12,) ---可以
    url=reverse('n1',kwargs={'year':2014,'month':12})-----也可以

    模板:
    {% url 'n1' 2012 12 %}----可以
    {% url 'n1' month=12 year=2012 %}----可以
    注意:按位置传,顺序是固定的

    作用:修改路由中url的时候,其它地方不需要改动

    七:名称空间

    名称空间:(知道它,但是建议不同app的url里name不能重名,app的名字_name)
    1 url(r'^app01/', include('app01.urls',namespace='app01')),
    urlpatterns = [
    url(r'^test',views.test3 ,name='test'),

    ]
    url(r'^app02/', include('app02.urls',namespace='app02')),
    urlpatterns = [
    url(r'^test02',views.test3 ,name='test'),

    ]
    2 在视图函数里:
    url=reverse('app02:test')
    print(url)
    3 在模板里:
    <a href="{% url 'app02:test' %}">点我跳到首页</a>

  • 相关阅读:
    博客美化
    hello world
    mysql数据库索引
    Golang:线程 和 协程 的区别
    计算机网络详解
    Redis持久化机制
    nginx 详解
    多级缓存的分层架构
    svn忽略文件不提交至服务器的方法
    Mysql 事务及其原理
  • 原文地址:https://www.cnblogs.com/yangzhizong/p/9584282.html
Copyright © 2011-2022 走看看