Django框架之路由
Posted gredae
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架之路由相关的知识,希望对你有一定的参考价值。
Django框架之路由
什么是路由
路由就是请求地址与视图函数的映射关系
urls.py
url('^index$', view.index) # Djaogo框架中必会技能
# 正则表达式, 视图函数
views.py
def article(request):
return render(request, 'index.html')
为路由分组
我们知道在正则表达式中是可以进行分组操作的,那么我们的Django框架也是支持对路由地址进行分组操作,这里的分组操作有两种方式,一种是有名分组,一种是无名分组
无名分组
urls.py
url('^index/(d+)$', view.index) # 我们在路由条件中定义了一组无名分组,这个时候只有请求中带有数字才会被路由到视图函数中,并且这个时候我们的视图函数还需要一个位置参数接收传递过来的数字
views.py
def article(request,sumber): print("传递上来的值是:",sumber) return render(request, 'index.html')
这个时候我们就可以通过url来传递一些参数了
有名分组
urls.py
url('^index/(?P<sumber>d+)$', view.index) # 有名分组与无名分组差不多都可以接受到通过url传递过的一个值,只不过有名分组和无名分组不同的一点是他是通过关键字的形式进行传参。也就是说我们的视图函数需要与我们的有名分组的名字一样,这样才能够接受到铜鼓url传递过来的值,不然就会报错
views.py
def article(request,sumber): # 这里的sumber需要与路由的匹配规则中的分组名称一致 print("传递上来的值是:",sumber) return render(request, 'index.html')
反向解析
有一天你正在写代码,写着写着,突然项目经理进来跟你说了一句,要改需求。。。
我们需要将你的url地址改一下,改成客户要求的形式。。。
emmmm,可能当时我们没有什么感觉,哦,原来只是改一下接口地址。
但是一细想,有种毛骨悚然的感觉,改这个需求相当于是要将所有的html文件的请求地址更改。-_-
这个时候如果有经验的人绝对不会将url地址直接写死在html文件中,要不然等什么时候有这种需求的时候会死人。
而Django可以帮助我们去动态解析url地址,称之为 反向解析
是不是感觉很高大上,其实我们只需要在写url的时候为url匹配规则设置一个别名
urls.py
url('^index/$', view.index, name="index")
url('^asdf/', view.login, name="login_page") # 为等下的后端反向解析做准备
现在我们将路由配置好了就需要为其他地方配置反向解析
前端
前端怎么解决url地址变更的问题呢,这个就要使用Django强大的模板语言了
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index页面</title> <!-- 这是index页面 --> </head> <body> <!--强调:login_page必须加引号--> <a href=“{% url 'login_page' %}”>这是跳转到登陆页面</a> </body> </html>
只要我们的前端页面这样设置就不怕项目经理要改你的url地址了,他会动态解析你的url,将真正的url请求地址帮你添加上去
后端
然而我们后端逻辑经常需要调转到其他页面去,例如没有登陆就必须需要你登陆才可以访问网站的内容,这个时候我们肯定是将你重定向到登陆页面去,这个时候我们也需要用到接口名,所以后端也需要反向解析。
from django.shortcuts import render,redirect,HttpResponse from django.shortcuts import reverse # 用于反向解析 def index(request): reverse('login_page') # reverse会将别名'login_page'反向解析成路径:/asdf/ return redirect("login_page")
这样我们后端接口就可以不需要大改,只需要将请求地址改一下就好了
但是这样是没问题了,那么路由经过了分组也可以这么做么?也是可以的,只是需要将反向解析的内容修改下就好了。
这个时候urls.py的内容不需要该变,前端页面的请求地址也不需要改变。只需要在reverse中添加你获取到的值就好了
def index(request, number):
reverse('login_page', number) # 只需要将接受到的分组后的值加到后面就可以了
return redirect("login_page")
路由分发
随着我们的项目越做越大,项目中的应用数可能多不胜数,更不要说是路由配置了,这个就是更加庞大了。这个时候我们就需要路由分发了。
路由分发就是讲请求分发到各个应用中让各个应用的路由来负责各个请求的详细分发。
这个就要有一个概念,就是每个应用中都是可以拥有自己的urls.py,templates文件夹,以及static文件夹。
我们需要在项目的urls.py文件中引入应用的url,再在应用中的urls.py中详细分发各个请求
项目下的urls.py
from django.conf.urls import url,include
url(r'^app01/',include("app01.urls")) # 千万不要在/后面加$符号,不让就不能路由到应用下分发了
应用下的urls.py
from django.conf.urls import url
from app02 import views
url(r'^index/$', views.index)
这样我们就可以实现路由分发了
以上是关于Django框架之路由的主要内容,如果未能解决你的问题,请参考以下文章
django之路由分组,路由分发,FBV,CBV,ORM框架
人生苦短,我用python-- Day19 django框架之URL路由系统视图应用模板应用django之orm应用