前言:
在前面我们已经学习了基础的Django了,今天我们将继续学习,我们今天学习的是路由分发:
路由分发是Web框架中的一个核心概念,它指的是将不同的URL请求映射到对应的处理函数(视图)的过程。在Django这样的Web框架中,路由分发是通过URL配置(通常在urls.py
文件中定义)来实现的。
1.什么是路由分发?
-
定义URL模式:在Django中,路由分发通常通过定义一系列的URL模式来实现。这些模式指定了URL的结构,以及当这些URL被访问时应该调用哪个视图函数。
-
映射到视图:每个URL模式都与一个视图函数或类关联。当一个请求的URL与某个模式匹配时,Django就会调用与之关联的视图函数来处理请求。
-
分发请求:路由分发的目的是将用户的请求分发到正确的视图函数。这个过程是动态的,根据请求的URL来决定。
-
组织URL:路由分发有助于组织项目的URL结构,使其清晰和易于维护。通过将URL映射到视图,开发者可以构建出逻辑清晰的Web应用程序。
2.Django中的路由分发
在Django中,路由分发是通过以下步骤实现的:
-
根URL配置:在项目的根目录下,通常会有一个
urls.py
文件,它包含了项目的主路由配置。 -
包含应用路由:在根
urls.py
文件中,可以使用include()
函数将请求分发到不同的应用。这允许每个应用有自己的路由配置,使得项目结构更加模块化。 -
应用URL配置:每个应用可以有自己的
urls.py
文件,用于定义该应用的路由规则。 -
正则表达式和路径表达式:Django允许使用正则表达式(通过
re_path()
函数)或路径表达式(通过path()
函数)来定义URL模式。 -
命名路由:路由可以被命名,这样可以在模板和视图中方便地引用它们。
-
重定向:路由分发也可以用来实现URL的重定向。
2.1应用级别的路由配置
每个Django应用下都可以有一个urls.py
文件,这个文件用于定义该应用的路由配置。
# UrlApp/urls.py
from django.urls import path
from . import viewsurlpatterns = [path('index/', views.index),
]
在这个例子中,UrlApp
是一个应用的名称,views
是该应用中定义视图的模块。urlpatterns
是一个列表,包含了该应用的所有路由规则。每个路由规则使用path()
函数定义,它接受一个URL模式和一个视图函数。
2.2项目的路由分发
在项目的根目录urls.py
文件中,你可以将请求分发到不同的应用。这是通过使用include()
函数实现的。
# 项目的根目录 urls.py
from django.urls import path, includeurlpatterns = [path('urlapp/', include('UrlApp.urls')),path('urlapp2/', include('UrlApp2.urls')),
]
这里的include()
函数用于包含另一个URL配置模块。当Django处理请求时,它会查看根urls.py
中的urlpatterns
列表。如果找到匹配的路由,它会将请求进一步分发到指定的应用路由配置中。
-
path('urlapp/', include('UrlApp.urls'))
:这行代码定义了一个路由规则,当用户访问/urlapp/
时,Django会查找UrlApp
应用下的urls.py
文件,并使用该文件中的urlpatterns
来进一步处理请求。 -
path('urlapp2/', include('UrlApp2.urls'))
:同样,这行代码为UrlApp2
应用定义了一个路由前缀/urlapp2/
。所有以这个前缀开头的URL都会交给UrlApp2
应用的urls.py
文件来处理。
2.3使用正则表达式匹配路由
Django的re_path()
函数允许使用正则表达式来匹配URL模式。
# 使用正则表达式匹配路由
from django.urls import re_path
from django.http import HttpResponse
from myapp import viewsurlpatterns = [re_path(r'^[A-Za-z]+/$', views.re_view),
]def re_view(request):return HttpResponse('这个视图的路由是英文字母响应')
在这个例子中,正则表达式r'^[A-Za-z]+/$'
匹配任何以一个或多个英文字母开头和结尾的URL。匹配到的字母部分会传递给re_view
视图函数。这个是正则表达式的通用表示。
2.4 URL参数传递
Django的path()
函数允许在URL中定义参数,并将其传递给视图函数。
# URL参数传递
from django.urls import pathurlpatterns = [path('demo/<urldata>/', views.get_url_data),
]def get_url_data(request, urldata):return HttpResponse(f'从 URL 中获取到的参数为:{urldata}')
在这个例子中,<urldata>
是一个动态路径参数,它会被替换为实际的URL部分,并作为参数传递给get_url_data
视图函数。
2.5 在URL映射中携带附加数据
path()
或re_path()
函数可以接受一个字典作为第三个参数,这个字典会被作为附加数据传递给视图函数。
urlpatterns = [path('extra/', views.extra, {'age': 28}),
]def extra(request, age):return HttpResponse(f'从 url 映射方法中获取到的附加数据为:{age}')
在这个例子中,字典{'age': 28}
会被传递给extra
视图函数。
2.6 默认参数
视图函数可以接受默认参数值,如果URL中没有提供相应的参数,将使用默认值。
urlpatterns = [path('default/', views.default_data),path('default/<data>/', views.default_data),
]def default_data(request, data=369):return HttpResponse(f'从 URL 中获取到的参数为:{data}')
在这个例子中,如果URL中没有提供data
参数,视图函数将使用默认值369
。
2.7.路由转换器
Django提供了一些内置的路由转换器,用于将URL参数转换为特定的数据类型。
urlpatterns = [path('int/<int:data>/', views.int_view),path('str/<str:data>/', views.str_view),path('path/<path:data>/', views.path_view),path('slug/<slug:data>/', views.slug_view),path('uuid/<uuid:data>/', views.uuid_view),
]def int_view(request, data):return HttpResponse(f'使用 int 转换器,接收到的数据为:{data}')def str_view(request, data):return HttpResponse(f'使用 str 转换器,接收到的数据为:{data}')def path_view(request, data):return HttpResponse(f'使用 path 转换器,接收到的数据为:{data}')def slug_view(request, data):return HttpResponse(f'使用 slug 转换器,接收到的数据为:{data}')def uuid_view(request, data):return HttpResponse(f'使用 uuid 转换器,接收到的数据为:{data}')
int
:匹配正整数,并将参数转换为整数类型。str
:匹配非空字符串。path
:匹配任意非空字符串,包括斜杠。slug
:匹配字母、数字、下划线和横线。uuid
:匹配通用唯一标识符(UUID)。
3.反向解析路由:
反向解析路由是Django中一个非常有用的功能,它允许你通过视图函数名(即URL的模式名称)来动态构建URL,而不是直接硬编码URL字符串。这种方式提高了代码的可维护性和灵活性,尤其是当你需要更改URL结构时,你只需要修改urls.py
文件中的路径,而不需要在整个项目中搜索和替换硬编码的URL。
在Django中,反向解析路由是一种动态获取URL的方式,它允许你在模板和视图中使用人可读的名称来引用URL,而不是硬编码的路径。这种方式提高了代码的可维护性和可读性。
3.1在HTML模板中反向解析路由
在模板中,可以使用{% url 'URL的模式名称' 参数 %}
来反向解析路由。
<body>反向解析路由<br><a href="{% url 'num' %}">点击开奖</a><br><a href="{% url 'age' 28 %}">不要点击</a><br>
</body>
这里,'num'
和'age'
是URL的模式名称,它们对应于视图的URL配置。
3.2在视图中反向解析路由
在视图中,可以使用reverse('URL的模式名称')
来获取URL。
from django.urls import reverse
from django.http import HttpResponse
from django.shortcuts import redirectdef text(request):return HttpResponse(f'视图解析路由:{reverse("num")}')def redirect_reverse(request):return redirect(reverse("num"))def text_data(request, data):return HttpResponse(f'视图解析路由:{reverse("age", args=[data])}')
reverse
函数接受URL的模式名称和一个可选的参数列表或关键字参数字典,返回对应的URL。
3.3URL的模式名称
在urls.py
中,通过给path
函数的name
参数赋值,可以为URL定义一个模式名称。
from django.urls import path
from . import viewsurlpatterns = [path('index/', views.index),path('html/', views.html_view),path('number/', views.number, name='num'),path('age/<data>/', views.data_view, name='age'),
]
3.4.URL的应用名称空间
在大型项目中,不同的应用可能有不同的URL配置,为了避免URL模式名称的冲突,Django允许为每个应用定义一个名称空间。
3.5定义应用名称空间
在应用的urls.py
文件中,可以定义一个app_name
属性来设置应用的名称空间。
app_name = 'urlapp2'
3.6在模板中使用应用名称空间
在模板中反向解析属于特定应用名称空间的URL时,需要指定应用名称空间和URL的模式名称。
<body><a href="{% url 'urlapp2:num' %}">点击开奖</a><br><a href="{% url 'urlapp2:age' 28 %}">不要点击</a><br>
</body>
在这里,'urlapp2'
是应用的名称空间,'num'
和'age'
是URL的模式名称。
3.7在视图中使用应用名称空间
在视图中,也需要使用带有应用名称空间的URL模式名称来反向解析URL。
def text(request):return HttpResponse(f'视图解析路由:{reverse("urlapp2:num")}')def redirect_reverse(request):return redirect(reverse("urlapp2:num"))def text_data(request, data):return HttpResponse(f'视图解析路由:{reverse("urlapp2:age", args=[data])}')
反向解析路由是Django中一个强大的功能,它允许你动态地构建URL,而不是硬编码。通过定义URL的模式名称和应用名称空间,你可以避免URL的冲突,并使你的代码更加清晰和易于维护。
结语:
今天关于Django的路由分发的部分就先分享到这里了,关于这个路由分发在整个的Django框架里面是非常重要的,因为是通过路由分发可以提高你的代码的灵活性和可维护性,不过由于小编的水平有限,这些关于路由分发的内容难免会有所遗漏,希望大家可以多多支持一下,也欢迎大佬的斧正,小编都会虚心接受的。今天的分享就先到这里了,大家下次再见!