反向解析是为了简便步骤,使代码更具可读性更优雅,重定向是防止重复提交相同数据造成资源浪费,甚至防御漏洞。
有客户端的浏览器发起一个url请求,Django根据URL解析,把url中的参数捕获,调用相应的试图,获取相应的数据,然后返回给客户端显示。
根据用户/浏览器发起的URL请求,它调用正确的Django视图,并从URL中提取它的参数需要的值。
通过一个视图的名字,再加上一些参数和值,逆向获取相应的URL。
根据Django视图中的标识和将要传递给它的参数的值,获取与之关联的URL。
将客户端发送的请求在服务器内部转发传递,浏览器的URL地址不变
防止客户端向服务器重复提交相同请求,浏览器的URL地址改变实现客户端跳转
1.HttpResponseRedirect('重定向的URL')
2.redirect()+reverse()
主路由urls.py文件中设置第一部分URL,namespace设置的就是命名空间
path("url/", include("url_app.urls",namespace="url")),
在子路由urls.py文件上端设置app_name,app_name设置的名字要与主路由命名空间设置名字保持一致
app_name = "url"
在子路由urls.py文件设置路径时,添加name属性,对应的是下一步在html文件中的第二部分URL
path("view/", get_reverse, name="view"),
在templates下的html文件中,在a标签内传递一个href(或者其他可传递url地址的位置,如form表单等)
模板:"{% url '第一部分URL:第二部分URL' %}"
不传参的反向解析:<a href="{% url 'url:hello' %}">不传参的反向解析</a>
传参的反向解析:<a href="{% url 'url:show' '苹果' '篮球' %}">传参的反向解析</a>
return redirect(reverse("第一部分URL:第二部分URL",args=(fruit,sport)))
args传递元组形式,kwargs传递字典形式
def get_reverse(request): #因为下面重定向到别的路径、调用别的函数,所以这里不需要设置参数
fruit = "banana"
sport = "basketball"
# return redirect(reverse("url:show",args=(fruit,sport)))
return redirect(reverse("url:show", kwargs={"fruit": fruit, "sport": sport}))