Django - 路由层

目录

一、简单路由实现(1.x)

二、无名分组

三、有名分组

四、反向解析:动态更改所有路径

1、视图函数内的反向解析:reverser()

2、模板层内的反向解析:{% url "别名" 参数  参数%}

 五、路由分发(1.x):防止一个路由文件的庞大导致可读性差

六、名称空间(namespace):防止重名路由冲突

七、伪静态:伪装成静态网页,有利于搜索导航的优先匹配

八、Django - 2.X 和1.X的区别

1、2.0的re_path  用法等同于 1.0的url

2、path :使用精确路径代替正则匹配

 2-1 转换器:将url传入的参数进行对应匹配,将符合匹配的接在url路径后

 2-2 自定义转换器

九、项目路由配置小技巧



一、简单路由实现(1.x)

from django.conf.urls import url
from app01 import views

'''
urlpatterns = [
     url(正则表达式, views视图函数(末尾通常不加括号),参数[字典形式],别名[可选的name参数]),
]
'''

urlpatterns = [
        url(r'^blog/$', views.blog),
]

二、无名分组

总结:

  • 按位置传参
  • url分组,以‘/’进行分组,
  • def publish(request,*args):   视图函数可以这样接收
  • 不可与有名分组混用
from django.conf.urls import url
from app01 import views

'''
urlpatterns = [
     url(正则表达式(传入参数), views视图函数(末尾通常不加括号),参数[字典形式],别名[可选的name参数]),
]
'''

urlpatterns = [
        # 路由后跟四个0-9的数字当做参数传给视图函数
        url(r'^blog/([0-9]{4})', views.blog),
        url(r'^publish/([0-9]{4})/([0-9]{2})$', views.publish)
]
# 视图函数接受参数
def blog(request,year):
    print(year)
    return HttpResponse('ok')

# 按位置接受传参
def blog(request,*args):
    return HttpResponse('ok')

三、有名分组

总结:

  • 按关键字传参
  • url(r'^publish/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$', views.publish),
    --- 格式:(?P<name>pattern);
    name:组的名称; pattern :匹配的模式
  • def publish(request, mounth,year): 视图函数需要定义形参,形参名字要跟分组的名字对应,与顺序无关
  • 不能和无名分组混用
from django.conf.urls import url
from app01 import views

'''
urlpatterns = [
     url(正则表达式(传入参数), views视图函数(末尾通常不加括号),参数[字典形式],别名[可选的name参数]),
]
'''

urlpatterns = [
        # 路由后跟四个0-9的数字取名为year当做参数传给视图函数
        url(r'^blog/(?P<year>[0-9]{4})', views.blog),
        url(r'^publish/(?P<year>[0-9]{4})/(?P<day>[0-9]{2})$', views.publish)
]
# 视图函数接受参数
def blog(request,day,year):
    print(year)
    print(day)
    return HttpResponse('ok')

四、反向解析:动态更改所有路径

1、视图函数内的反向解析:reverser()

'''
# urls.py文件内的路由配置 

-1 无参数
url(r'^publishadd133/$', views.publishadd,name='ddd'),
-2 无名分组
url(r'^publishadd/([0-9]{4})/([0-9]{2})/$', views.publishadd,name='ddd'),
-3 有名分组
url(r'^publishadd/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$', views.publishadd,name='ddd'),
'''

from django.shortcuts import reverse
			
# 无参数
url=reverse('ddd')
# 无名分组
url=reverse('ddd',args=(2018,12,))
# 有名分组
url=reverse('ddd',args=(2018,12,)) 
url=reverse('ddd',kwargs={'year':2018,'mounth':12})

2、模板层内的反向解析:{% url "别名" 参数  参数%}

'''
# urls.py文件内的路由配置 

-1 无参数
url(r'^publishadd133/$', views.publishadd,name='ddd'),
-2 无名分组
url(r'^publishadd/([0-9]{4})/([0-9]{2})/$', views.publishadd,name='ddd'),
-3 有名分组
url(r'^publishadd/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$', views.publishadd,name='ddd'),
'''

# 无参数
{% url 'ddd' %}
# 无名分组
{% url 'ddd' 2018 12 %}
# 有名分组
{% url 'ddd' 2018 12 %} 
{% url 'ddd' year=2018 mounth=12 %}

 五、路由分发(1.x):防止一个路由文件的庞大导致可读性差

# 总路由文件
from django.conf.urls import url,include
urlpatterns = [
    url(r'^app01/',include('app01.urls'))
    url(r'^app02/',include('app02.urls'))
]

''' 注意: 总路由文件内,不能在正则匹配内添加$结束符 '''
# app文件夹内路由文件
from django.conf.urls import url
from app02 import views

urlpatterns = [
    url(r'^user/$',view.user)
    url(r'^user_list/$',view.user_list)
]

'''
浏览器查看指定路由:128.0.0.1:8000/app02/user
'''

六、名称空间(namespace):防止重名路由冲突

命名空间(英语:Namespace)是表示标识符的可见范围。
一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回

我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。

# 导入include 并且在路由分发的时候设置 namespace
from django.conf.urls import url,include
urlpatterns = [
    url(r'^app00/',include('app00.urls',namespace='app00')),
    url(r'^app01/',include('app01.urls',namespace='app01')),
]
# 视图函数诶的反向解析
url=reverse('app00:index')
print(url)
url2=reverse('app01:index')
print(url2)

# 模板层内的反向解析
{% url 'app01:test'%}
# <a href="{% url 'app00:index'%}">哈哈</a>

七、伪静态:伪装成静态网页,有利于搜索导航的优先匹配

# 路由的书写
# 有名分组 id匹配一个数字 字符串连接.html
url(r'^book/(?P<id>\d+.html)',views.book),

# 路由器的访问 :http://127.0.0.1:8000/book/4.html

八、Django - 2.X 和1.X的区别

1、2.0的re_path  用法等同于 1.0的url

from django.contrib import admin
from django.urls import path, re_path
from app01 import views

urlpatterns = [
    # re_path---->原来的url
    # re_path('正则',视图函数)
    re_path('^test/(?P<year>\d+)',views.re_test),
]

2、path :使用精确路径代替正则匹配

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    # path传的第一个参数,不是正则,准确的路径,不支持正则
    # path('精确路径/<转换器:匹配路径参数>',视图函数(不支持传参操作),别名)
    # path('test/<path:year>', views.re_test),
    # path('test/<yyy:year>', views.re_test,name='test'),
    path('test/', views.re_test,),
]

 2-1 转换器:将url传入的参数进行对应匹配,将符合匹配的接在url路径后

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

 2-2 自定义转换器

from django.contrib import admin
#导入自定义转换器所需的 register_converter
from django.urls import path,register_converter
from app01 import views


# 自定义转换器
# 1 定义一个类
class MyCon:
    # 写一个正则表达式
    regex = '[0-9]{4}'

    # 匹配出來的数据,会传到这里,retrun回去的,会被视图函数接收
    def to_python(self, value):
        return value

    # 反向解析用的
    def to_url(self, value):
        return '%04d' % value

#注册转换器名: register_converter(自定义类名,'自定义转换器名') 
register_converter(MyCon,'yyy') 

urlpatterns = [
    path('test/<yyy:year>', views.re_test,name='test'),

]

九、项目路由配置小技巧

  • 根路径配置,即首页默认指定视图函数   url(r'^$',views.book)
  • 配置错误路径,即从上至下无匹配路径之后响应默认视图函数 url(r'',views.errors)

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/83866955