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定义路由_子路由_函数视图的主要内容,如果未能解决你的问题,请参考以下文章

Django定义路由_子路由_函数视图

01_Django-介绍-项目结构-URL和视图函数

01_Django-介绍-项目结构-URL和视图函数

01_Django-介绍-项目结构-URL和视图函数

01_Django-介绍-项目结构-URL和视图函数

django的路由层