Django定义路由_子路由_函数视图
Posted 七月的小尾巴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django定义路由_子路由_函数视图相关的知识,希望对你有一定的参考价值。
Django定义路由
什么是路由,怎么去定义路由?
通常在我们创建项目包中,有个url.py的文件,我们需要去定义路由信息,所谓的路由信息,就是我们前端和用户在访问的时候,于我们后端视图之间的一一映射关系,我们叫做路由。
添加路由
需要在全局路由文件中(url.py),urlpatterns 列表中添加路由条目
urlpatterns 列表的底层逻辑为 路由会从上到下进行匹配,称为 “路由寻址”
, 如上面代码所示,我们定义了一个 urlpatterns 列表, 此时我们有一个 “get_project/”
的路由地址,程序会先在 urlpatterns 去匹配
'index/'
,发现'index/'
和“get_project/”
未匹配上,此时会向下向下匹配,知道匹配到 “get_project/”
,匹配成功之后则在前端页面展示。
urlpatterns 条目中一单匹配成功, 就会终止往下匹配,如果期间全部匹配完,仍然没有匹配到地址,则页面 404。
from django.urls import path
from project.views import index, get_project
urlpatterns = [
# path('admin/', admin.site.urls),
path('index/', index),
path('get_project/', get_project),
]
Path 函数
-
Path函数 用于定义路由条目
-
第一个 参数为 url 路径参数(字符串),路径最前面不能添加 /, 路径最后面需要添加 /,如图
“get_project/”
-
第二个 参数为 视图函数 或者 类视图,如果添加视图函数无需()调用
错误实例: path('index/', index()), 正确实例: path('index/', index),
-
如果 第二个参数为 include,那么会继续到子路由中匹配,子路由的匹配规则于全局路由匹配规则一致
-
path 的第一个参数可以使用类型转换器 <类型转换器:参数名称>, 如:
<int:name>
默认类型转换器: int、str、slug、uuid, 参数名称,在调用视图时,会自动传递给视图函数, 需要使用同名的参数去接收它
添加路由实战
首先,我们在 子应用的 view.py 中创建最简单一个视图
def index(request):
return HttpResponse("欢迎测试开发")
创建好视图之后,此时我们创建一个路由,让后端视图 和 url 映射。因此我们需要在 url.py中的 urlpatterns 中添加路由。
首先,我们需要导入后端视图, from project.views import index
,这个和我们在 python 导包类似,导入之后使用 path() 函数定义路由条目
from django.urls import path
from project.views import index, get_project
urlpatterns = [
# path('admin/', admin.site.urls),
path('index/', index),
path('get_project/', get_project),
]
重新启动 django 服务,访问 index/ 路由,我们可以看到这个页面,说明我们程序成功了。
路由定义的痛点
按照上方我们定义路由的场景,正常情况下程序运行是没有什么问题的,但是我们思考一下,假设我们此时需要开发一个大型项目,那么我们可能会定义成千上万的路由,那么这种情况下,我们按照上方的路由定义规则,显然不合理,那么针对这种场景,我们应该怎么处理呢?
在子应用中创建 urls.py
当我们项目特别庞大时,会有多个模块,因为我们可以在不同的子应用中,定义单独的 urls 路由 。
from django.urls import path
from project.views import get_project, create_project, delete_project, put_project
# 假设我们分别定义了四个视图 get_project, create_project, delete_project, put_project
urlpatterns = [
path('get_project/', get_project),
path('put_project/', put_project),
path('create_project/', create_project),
path('delete_project/', delete_project),
- 我们添加了子理由之后,此时我们到主路由下,添加子路由,使用 include()方法
- include() 中 project.urls ,project为我们的子子引用名称,urls为子应用的中 urls.py文件,这里和python中的导包类似
- include() 会进入到子路由中匹配,子路由的匹配规则和主路由规则一致
urlpatterns = [
path('project/', include("project.urls")),
]
按照上方的逻辑,我们在 django 框架中定义了一个子路由,但是这里我们思考一下,假设主路由和子路由中有相同的路由,程序中是如何处理的?
假设主路由中,我们有个路由为 'index/',子路由中,我们同样配置了 'index/',但是两个路由配置了不同的视图 此时程序会先去主路由中查找,如果在主路由中找到了,则会跳转到主路由对应的视图 如果主路由没有找到,才会进入到子路由。
处理路由中的动态参数
首先,我们定义一个可以接收参数的视图,其中函数中的 pk
为我们可接收的动态参数。
def get_projects(request, pk):
return HttpResponse(f"获取项目信息:pk")
然后我们此时在 urls 路由中配置路由,添加路径参数 int:xxx, 参数值必须要是int类型
# 注意,我们这里 <int:pk> 接收的是 pk这个参数,并且为int类型
# 那么视图函数,我们接收的参数名称也需要是 pk
urlpatterns = [
path('projects/<int:pk>/', get_projects),
]
重新项目之后,我们再来访问路由
当然,django提供了非常完善的功能,目前我们的参数内容都是完整的,django 也支持正则匹配。
# 我们需要导入 re_path
from django.urls import re_path
# repath中我们需要填写正则内容,注意点:
1)首先第一个我们必须要使用 r 开头,后方填写正则字符串信息
2)正则表达式中,必须要在 以 ^ 开头, $ 结尾
urlpatterns = [
re_path(r'^projects/(?P<pk>\\w3)/$', get_projects)
]
以上是关于Django定义路由_子路由_函数视图的主要内容,如果未能解决你的问题,请参考以下文章