路由控制

1. 简单的路由配置

  • 作用:URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表
  • 格式:
from django.conf.urls import url
from django.contrib import admin
from app名 import views
urlpatterns = [
     url(r'^admin/', admin.site.urls),
     url(正则表达式, views视图函数,参数,别名),
]
(1)正则表达式:一个正则表达式字符串
(2)views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
(3)参数:可选的要传递给视图函数的默认参数(字典形式)
例:
url(r'^register/$', views.register,{'name':'qqc','age':'11'}),视图函数中要有相对应的参数进行接收
(4)别名:一个可选的name参数
  • 例子
注:Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True其作用就是自动在网址结尾加'/'伪静态(以ntml结尾),方便搜索引擎收录.

2. 分组

2.1 无名分组

  • 格式:url(r'^admin/', admin.site.urls),
  • 第一个参数,可以写一个正则表达式 从上往下匹配,一旦匹配成功,就不往下走了 如果分几个个组,相应的视图函数,就应该接收几个

2.2 有名分组

  • 格式:
url('地址/(?P<name>pattern)', views.函数名)
注:name 是组的名称,pattern 是要匹配的模式
--------------------------------------
例子:
url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test)
对应的函数:
def test(request,month,year):
    print(year)
    print(month)
    return HttpResponse('ok')

注:
(1)名字必须一致,否则报错,位置可以颠倒,如果分了两个组,必须用两个参数接
(2)有名分组和无名分组不要混用
(3)有名分组可以用**kwargs接收,无名分组可以用*args接收
(4) 分组捕获的参数,都是str类型,捕获的值作为关键字参数而不是位置参数传递给视图函数
(5)视图函数可以设置默认参数

3. 路由分发

  • 步骤
(1)在主urls文件导入from django.conf.urls import include
(2)在主urls文件设置所要分发的app文件,
两种方式:
url(r'^app01/', include('app01.urls')),
url(r'^app01/', include(urls))
(3)urlpatterns 不能变名字,app文件中的url格式相同

例:

主urls:
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
from app01 import urls
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app01/',include('app01.urls')),
]

app文件中的urls:
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^func/(?P<year>[0-9]{2})/(?P<month>[0-9]{1})', views.func),
]

  

 app 文件中的视图函数:
from django.shortcuts import render 
from django.shortcuts import render,HttpResponse,reverse 
def func(request,year,month): 
    print(month) print(year) 
return HttpResponse ('my app01') 
 
  • Django 版本区别
2+版本的re_path 就是1+版本的url
2+版本多了一个path,不支持正则

4. 反向解析

  • 作用:修改路由中的URL时,其他地方无需改动也可访问原来的地址
  • 导入模块from django.shortcuts import reverse
  • 在视图函数中
urls文件:
  url(r'^test',views.test2),
  #绑定name='n',即使访问地址改变也可以找到
  url(r'^index555/',views.index,name='n'),
  
views 文件:
def test2(request):
    url=reverse('n')
    #通过reverse()得到改变过后的地址 /index555/ (原来的地址是index)
    print(url) 
    #将url(改变后的地址)传入,返回之前的信息 '我是index'
    return redirect(url)  
    # return HttpResponse ('hhhhhhhhhh')
def index(request):
    return HttpResponse ('我是index')
  • 在模板中使用 {% url 'n1'%}
  • 带位置参数
url(r'^index/([0-9]{4})/([0-9]{2})', views.index,name='n1'),

视图:url=reverse('n1',args=(2012,12,))

模板:{% url 'n1' 2012 12 %}
注:按顺序传顺序是固定的
  • 带关键字参数
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 %}----可以
5. 名称空间

  

  • 反向解析时,不同的app文件的url中name指定的名字相同 那么在路由分发时可以指定名称空间namespace='app01'

6. Django 2.0+ 版本

  • django2.0的re_path和1.0的url一样
  • path
导入:
from django.urls import path
#不支持正则,精准匹配
#有五个转换器
(1)str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
(2)int,匹配正整数,包含0。
(3)slug,匹配字母、数字以及横杠、下划线组成的字符串。
(4)uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
(5)path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
 
 用法:
 path('index/<int:year>',views.index)
 -----------------------------------
注:在<>内指定转换器和参数,根据转换器规则匹配;
如果没有转换器将匹配任意字符;
无需添加前导斜杠
  • 注册自定义转换器
class Test:
    regex='[a-z]{3}'
    def to_python(self,value):
        return str(value)
    def to_url(self,value):
        return '%03s' %value
# 定义个转化器msg,注册到url配置中
register_converter(Test,'msg')
urlpatterns = [
    path('index/<msg:y>',views.index)
]

(1)regex 类属性,字符串类型
(2)to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
(3)to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。
原文地址:https://www.cnblogs.com/quqinchao/p/10187294.html