zoukankan      html  css  js  c++  java
  • django学习第78天Django路由控制

    一.路由的基本配置

    1.基本概念

    URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;
    你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行
    from django.conf.urls import url
    
    urlpatterns = [
         url(正则表达式, views视图函数,参数,别名),
    ]

    # url是个函数,有四个参数,第一个参数要传正则表达式,第二参数传函数内存地址,第三个参数传默认参数,第四个是路由的别名
    url(r'^liuqingzheng/article/aa.html$', views.test),
    -路由从上往下匹配,一旦匹配成功,后面就不继续匹配了

    正则表达式:一个正则表达式字符串
    views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
    参数:可选的要传递给视图函数的默认参数(字典形式)
    别名:一个可选的name参数
    注意:
    
    若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
    不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
    每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义
    urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续
    '''
     一些请求的例子:
    
    /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数views.month_archive(request, '2005', '03')。
    /articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。
    /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。请像这样自由插入一些特殊的情况来探测匹配的次序。
    /articles/2003 不匹配任何一个模式,因为每个模式要求URL 以一个反斜线结尾。
    /articles/2003/03/03/ 将匹配最后一个模式。Django 将调用函数views.article_detail(request, '2003', '03', '03')。
       
        '''

    2. APPEND_SLASH

    定义:# 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项
    APPEND_SLASH=True
    Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。
    访问 http://www.example.com/blog 时,默认将网址自动转换为 http://www.example/com/blog/ 。
    
    如果在settings.py中设置了 APPEND_SLASH=False,此时我们再请求 http://www.example.com/blog 时就会提示找不到页面。

    二.路由分组

    1.路由的无名分组

    url(r'^test2/(d+)/(w+)$', views.test2),(2个正则位置,对应要求传2个符合正则条件的参数)
    无名分组分出几个值,视图函数就要接受几个值(位置参数形式传过来的)

    2.路由的有名分组

    url(r'^test3/(?P<id>d+)/(?P<name>w+)$', views.test3),(名字写在?P<>里后面跟符合正则匹配的参数,比如id为名字)
    有名分组分出几个值,视图函数就要接受几个值(按关键字传入,位置可以打乱)

    3.注意:有名和无名不能混着用

    三.路由分发

            1 导入include
                -from django.conf.urls import include
            2 在主路由中添加新的url配置:    
                url(r'^app01/', include('app01.urls')),
                url(r'^app02/', include('app02.urls')),
            3 在所有的app中新建一个urls
                from app01 import views
                urlpatterns = [
                    url(r'^test/', views.test),
                ]
            4 如果浏览器输入app01/test/,就会响应到app01下views中的test取执行,如果不加app名字就会找不到这个路由然后报错

    四.反向解析:

    1.什么作用

    在视图函数中重定向的地址原来是写死的,如果url地址变更,我需要所有的url都修改,很麻烦,所有可以通过反向解析,获得url的地址

    2.怎么用

                -路由层:
                    url(r'^test_2/$', views.test2,name='test2'),
                -视图层:
                    from django.shortcuts import reverse
                    url=reverse('url地址的别名')
                    #如果做了分组
                    url=reverse('url地址的别名',args=[],kwargs={})
                -模板层:
                    {% url 'url地址的别名'%}
                    #如果做了分组
                    {% url 'url地址的别名' 参数1 参数2%}

    要点:你需要反向解析的路由设置别名,当你反向解析的时候添加别名,获得一个返回值,最后重点向这个返回值,就是不需要通过具体名字就能跳转

    五.名称空间

            -路由分发时,可以指定名称空间:
                -url(r'^app01/', include('app01.urls',namespace='app01')),
                -url(r'^app02/', include('app02.urls',namespace='app02')),
                
            -在视图中反向解析:
                url=reverse('app01:test')
            -在模板中反向解析:
                {% url 'app01:url地址的别名'%}
            -个人不建议这么使用:
                在不同app的urls中起别名的时候,添加:app名_别名

    注意:如果设置了空间名称,在调用分路由的别名时候,必须在前面添加空间名字:

    五.django2.0版本

    1.区别

            -1.几的url就是2.几的re_path
            -2.0的path 第一个参数不再是正则表达式
            -5个转换器:int,str,slug,path,uuid
    Django默认支持以下5个转化器:
    
    str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    int,匹配正整数,包含0。
    slug,匹配字母、数字以及横杠、下划线组成的字符串。
    uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
    path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?
    基本规则:
    
    使用尖括号(<>)从url中捕获值。
    捕获值中可以包含一个转化器类型(converter type),比如使用 <int:name> 捕获一个整数变量。若果没有转化器,将匹配任何字符串,当然也包括了 / 字符。
    无需添加前导斜杠。
    from django.urls import path  
    from . import views  
    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>/', views.article_detail),  
      # path才支持,re_path不支持
      path('order/<int:year>',views.order),
    ]  

    2.自定义转换器

    对于一些复杂或者复用的需要,可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:
    
    regex 类属性,字符串类型
    to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
    to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。
    class FourDigitYearConverter:  
        regex = '[0-9]{4}'  
        def to_python(self, value):  
            return int(value)  
        def to_url(self, value):  
            return '%04d' % value

    使用register_converter 将其注册到URL配置中:

    from django.urls import register_converter, path  
    from . import converters, views  
    register_converter(converters.FourDigitYearConverter, 'yyyy')  
    urlpatterns = [  
        path('articles/2003/', views.special_case_2003),  
        path('articles/<yyyy:year>/', views.year_archive),  
        ... 
  • 相关阅读:
    CentOS6.4 安装 codeblocks-12.11
    SpringCloud 进阶之Hystrix(断路器)
    SpringCloud 进阶之Ribbon和Feign(负载均衡)
    SpringCloud 进阶之Eureka(服务注册和发现)
    SpringCloud 入门
    SpringBoot与消息(RabbitMQ)
    SpringBoot 与缓存
    SpringBoot 之数据访问
    Spring Data 之 Repository 接口
    Spring Data之Hello World
  • 原文地址:https://www.cnblogs.com/ye-hui/p/10241619.html
Copyright © 2011-2022 走看看