Django-路由层

目录

  1. URL基本语法
  2. 分组
  3. 路由分发
  4. 反向解析
  5. 命名空间
  6. 传递额外参数给视图函数

URL基本语法

"""Django 1.1.x版本的基本格式"""
from django.conf.urls import url

urlpatterns = [
		url(reg, view, kwargs, name),
		...
]

ps:参数说明
	reg:必选,一个正则表达式字符串,表示URL规则与之匹配的会执行视图函数
	view:必选,视图函数,一个可调用对象
	kwargs:可选,要传递给视图函数的参数(字典形式)
	name:可选,别名,用来反向获取URL
	]
	
"""Django 2.2.x之后版本基本格式"""
from django.urls import path

urlpatterns = [
		path(route, view, kwargs, name),
		...
]

ps:参数说明
	route:必选,字符串,表示URL规则与之匹配的会执行视图函数
	view:必选,视图函数,一个可调用对象
	kwargs:可选,要传递给视图函数的参数(字典形式)
	name:可选,别名,用来反向获取URL

"""PS"""
Django 2.0的path不支持正则表达式,但是re_path支持正则表达式
from django.urls import re_path

urlpatterns = [
		re_path(reg, view, kwargs, name),
		...
]

分组

urlpatterns中的元素按照书写顺序从上至下逐一匹配正则表达式,一旦匹配成功则不在继续。
每个正则表达式前面的 ‘r’ 是可选的,但是一般加上
在正则表达式后面添加一对圆括号即可分组匹配,捕获其匹配的值传给视图函数(捕获的值永远都是字符串),即为分组,分组包括无名分组和有名分组。
关闭尾部自动补全 ‘/’(默认为开启的),在settings最下面添加:APPEND_SLASH=False

无名分组

无名分组按位置传参,一一对应,即视图函数除必须参数request外,其形参的数量应与urls中的分组数量一致。

语法:re_path(路由地址/(正则表达式))
实例:
	urls.py
	re_path(r'^index/(\d+)', views.index)			# 匹配任意数字,将匹配的数字传递给视图函数
			
	views.py
	def index(request, args):						# 接受匹配到的数据,变量名随便命名
		return HttpResponse(args)					# 返回数据给浏览器

有名分组

有名分组按关键字传参,除必选参数request外,其形参的数量应与urls中分组 数量一致,且名称必须一样。

语法:re_path(路由地址/(?P<组名>正则表达式))
实例:
	urls.py
	re_path(r'^index/(?P<num>[0-9]+)', views.index)		# 匹配任意数字且组名为num,将匹配的数据传给视图函数
	
	views.py
	def index(request, num):							# 接受匹配的数据且变量名必须为num
		return HttpResponse(num)						# 返回数据给浏览器

路由分发

使用路由分发可以使每个app都单独拥有自己的urls 
步骤:
	1、在每个app目录下创建一个urls.py文件
	2、在项目目录下的urls.py文件里,统一将路径分发给各个app目录
语法:include(app.urls)
实例:
项目目录下的urls.py
urlpatterns = [
	path('app01/', include('app01.urls')),				# 路由分发
	path('app02/', include('app02.urls')),
	]

app01下的urls.py
urlpatterns = [
    re_path(r'^index/([a-z]+)', views.index)
]
	
app02下的urls.py
urlpatterns = [
    re_path(r'^index/(?P<every>\w+)', views.index)
]

反向解析

当路由层的url发生改变,可以在视图层和模板层动态反向解析出更改后的url,俗称起别名。

1、普通模式
语法:path(路由地址, 视图函数, name='路由别名')
实例:
urls.py
urlpatterns = [
	path('index/', views.index, name='index'),
]

views.py
通过reverse进行反向解析(reverse("路由别名")def index(request):
	return redirect(reverse('index')

templates中HTML文件下
通过模板语法进行反向解析({% url "路由别名" %}<from action="{% url 'index' %}" method="post">

2、分组模式
	无名分组
		urls.py
		re_path(r'index/(\d+)', views.index, name='index')
		
		views.py
		reverse("路由别名", args=(符合正则匹配的参数,))
		def index(request, num):
			return redirect(reverse("index", args=(num,))
	
		templates
		{% url "路由别名" 符合正则匹配的参数%}
		<from action="{% url 'index' 1 %}" method="post">
	
	有名分组
		urls.py
		re_path(r'^index/(?P<every>\w+)', views.index, name="index")
	
		views.py
		reverse("路由别名", kwargs={"分组名":符合正则匹配的参数}
		def index(request, every):
			return redirect(reverse("index", kwargs={"every":every}))
		
		templates
		{% url "路由别名" 分组名=符合正则匹配的参数%}
		<from action="{% url 'index' every=1 %}" method="post">

命名空间

一个标识符可以在多个命名空间中定义,它在不同的命名空间中含义是互不相干的(相同别名下使用名称空间)

语法:include(("app名称.urls", "app名称"))
实例:
项目目录下的urls.py
urlpatterns = [
	path('app01/', include('app01.urls', 'app01'))
	path('app02/', include('app02.url', 'app02'))
]

app01下的urls.py
re_path(r'^index/(\d+)', views.index, name='index')

app02下的urls.py
path('index/', views.index, name='index')

app02下的views.py
reverse("app名称: 路由别名")
def index(request):
	return(redirect("app01: index"))

templates下
{% url "app名称:路由别名"%}
<form action="{% url 'app01:index' %}" method="post">

传递额外参数给视图函数

可以额外传给视图函数一个字典,表示相传给视图函数的位置参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值