一、路由模块化
在一个Django项目中,由于功能类别不同,因此需要将不同功能进行模块化设计。在Django项目中模块化设计则需要将不同模块封装为对应的app模块,每一个模块中涉及到的路由则也需要进行模块化设计,才能更好的让整个项目的耦合性更低。
- 创建app的适用条件
- 功能模块化:为了将项目功能清晰划分,提高可维护性。
- 重用代码:为了在多个项目中重用特定功能模块。
- 大型项目拆分:为了提高大型项目的可管理性和可扩展性。
- 团队协作:为了在团队开发中减少代码冲突,提高工作效率。
- 插件或第三方集成:为了更好地管理和隔离第三方服务或插件。
- 测试和开发分离:为了在开发过程中便于管理和维护测试代码。
- API开发:为了集中和清晰地处理API请求。
- 遵循DRY原则:为了避免代码重复,提高代码复用性。
- 项目结构清晰:为了提高代码的可读性和逻辑性。
- 遵循Django的最佳实践:为了符合Django项目推荐的模块化开发方式
在Django项目中创建app的命令:
# 将movie替换为自己的app名称
python manage.py startapp movie
在movie包中的view视图文件中创建视图,如下:
from django.shortcuts import render, HttpResponse
# Create your views here.
def movie_list(request):
return HttpResponse("电影列表")
def movie_index(request, movie_id):
return HttpResponse(f"你的电影ID为:{movie_id}")
在movie包中创建urls文件,并在其中将视图文件映射到url上,如下:
"""
@Author :江上挽风&sty
@Blog(个人博客地址):https://blog.csdn.net/weixin_56097064
@File :urls
@Time :2024/12/30 15:49
@Motto:一直努力,一直奋进,保持平常心
"""
from django.urls import path
from . import views
urlpatterns = [
path('movie_list', views.movie_list, name='movie_list'),
path('movie_index/<int:movie_id>', views.movie_index, name='movie_index')
]
最后在Django项目的urls文件中将创建的movie中的urls文件进行关联:
"""
URL configuration for DjangoProjectCode project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from django.shortcuts import HttpResponse
from book import views
# 默认的地址为:http://127.0.0.1:8000/
# 如果我想要访问默认地址下的其他内容,可以通过定义视图并将视图进行映射
def index(request):
return HttpResponse("这是默认页面")
def my_page(request):
return HttpResponse("我的第一个Django项目,我们一定会顺利毕业滴!")
urlpatterns = [
path("admin/", admin.site.urls),
path("", index), # 双引号中为空内容,表示为默认地址
path("mypage", my_page), # 自定义url
path("book", views.book_detail_query_id),
# 在book_id前面添加指定参数类型,如果在浏览器中输入了非整型,会报404错误,并且在视图函数中,book_id就是一个整型,否则是字符串类型
path("book/<int:book_id>", views.book_detail_path),
# 将movie app中的urls关联到项目urls中
path("movie/", include("movie.urls"))
]
项目演示:
二、路由反转
2.1、概念
在Django项目中,路由反转是指通过视图函数的名称或路径对象来动态生成URL的过程。这是Django URL dispatcher的一个特性,允许你在模板、视图或其他Python代码中引用视图,而不是硬编码URL。
- 进行路由反转的优势:
减少硬编码:避免在代码中硬编码URL,使得URL的修改更加灵活,只需更改URL配置而不需要修改引用该URL的代码。
提高代码可维护性:当URL发生变化时,只需更改一处即可,无需搜索整个项目中的硬编码URL,降低了维护成本。
增强代码的可读性:使用视图名称或路径对象引用URL,使得代码更加清晰易懂,尤其是对于大型项目来说,可以快速定位到对应的视图函数。
支持国际化:在进行国际化时,URL可能会根据语言的不同而变化,路由反转可以动态生成适应不同语言环境的URL。
简化测试:在编写测试时,可以使用路由反转来构造测试URL,而不需要关心具体的URL路径是什么。
支持命名空间:在Django中,可以使用命名空间来组织URL,路由反转可以帮助正确地解析带有命名空间的URL。
动态URL生成:在某些情况下,URL可能依赖于动态数据,如对象的ID或slug,路由反转可以方便地生成这些动态URL。
2.2、实现方式
测试代码:
"""
URL configuration for DjangoProjectCode project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from django.shortcuts import HttpResponse
from book import views
from django.urls import reverse"""
URL configuration for DjangoProjectCode project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from django.shortcuts import HttpResponse
from book import views
from django.urls import reverse
# 默认的地址为:http://127.0.0.1:8000/
# 如果我想要访问默认地址下的其他内容,可以通过定义视图并将视图进行映射
def index(request):
print(reverse("index"))
return HttpResponse("这是默认页面")
def my_page(request):
return HttpResponse("我的第一个Django项目,我们一定会顺利毕业滴!")
urlpatterns = [
path("admin/", admin.site.urls),
path("", index, name='index'), # 双引号中为空内容,表示为默认地址
path("mypage", my_page), # 自定义url
path("book", views.book_detail_query_id, name='book_id'),
# 在book_id前面添加指定参数类型,如果在浏览器中输入了非整型,会报404错误,并且在视图函数中,book_id就是一个整型,否则是字符串类型
path("book/<int:book_id>", views.book_detail_path, name='book_path'),
# 将movie app中的urls关联到项目urls中
path("movie/", include("movie.urls"))
]
# 默认的地址为:http://127.0.0.1:8000/
# 如果我想要访问默认地址下的其他内容,可以通过定义视图并将视图进行映射
def index(request):
print(reverse("index"))
return HttpResponse("这是默认页面")
def my_page(request):
return HttpResponse("我的第一个Django项目,我们一定会顺利毕业滴!")
urlpatterns = [
path("admin/", admin.site.urls),
path("", index, name='index'), # 双引号中为空内容,表示为默认地址
path("mypage", my_page), # 自定义url
path("book", views.book_detail_query_id, name='book_id'),
# 在book_id前面添加指定参数类型,如果在浏览器中输入了非整型,会报404错误,并且在视图函数中,book_id就是一个整型,否则是字符串类型
path("book/<int:book_id>", views.book_detail_path, name='book_path'),
# 将movie app中的urls关联到项目urls中
path("movie/", include("movie.urls"))
]
运行项目并访问http://127.0.0.1:8000/得到:
通过传递参数:
"""
URL configuration for DjangoProjectCode project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from django.shortcuts import HttpResponse
from book import views
from django.urls import reverse
# 默认的地址为:http://127.0.0.1:8000/
# 如果我想要访问默认地址下的其他内容,可以通过定义视图并将视图进行映射
def index(request):
print(reverse("book_path",kwargs={"book_id":1}))
# print(reverse("index"))
return HttpResponse("这是默认页面")
def my_page(request):
return HttpResponse("我的第一个Django项目,我们一定会顺利毕业滴!")
urlpatterns = [
path("admin/", admin.site.urls),
path("", index, name='index'), # 双引号中为空内容,表示为默认地址
path("mypage", my_page), # 自定义url
path("book", views.book_detail_query_id, name='book_id'),
# 在book_id前面添加指定参数类型,如果在浏览器中输入了非整型,会报404错误,并且在视图函数中,book_id就是一个整型,否则是字符串类型
path("book/<int:book_id>", views.book_detail_path, name='book_path'),
# 将movie app中的urls关联到项目urls中
path("movie/", include("movie.urls"))
]
运行项目并访问http://127.0.0.1:8000/得到:
查询字符串传参:
"""
URL configuration for DjangoProjectCode project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from django.shortcuts import HttpResponse
from book import views
from django.urls import reverse
# 默认的地址为:http://127.0.0.1:8000/
# 如果我想要访问默认地址下的其他内容,可以通过定义视图并将视图进行映射
def index(request):
print(reverse("book_id")+"?id=1")
# print(reverse("book_path",kwargs={"book_id":1}))
# print(reverse("index"))
return HttpResponse("这是默认页面")
def my_page(request):
return HttpResponse("我的第一个Django项目,我们一定会顺利毕业滴!")
urlpatterns = [
path("admin/", admin.site.urls),
path("", index, name='index'), # 双引号中为空内容,表示为默认地址
path("mypage", my_page), # 自定义url
path("book", views.book_detail_query_id, name='book_id'),
# 在book_id前面添加指定参数类型,如果在浏览器中输入了非整型,会报404错误,并且在视图函数中,book_id就是一个整型,否则是字符串类型
path("book/<int:book_id>", views.book_detail_path, name='book_path'),
# 将movie app中的urls关联到项目urls中
path("movie/", include("movie.urls"))
]
运行项目并访问http://127.0.0.1:8000/得到:
命名空间传参:
"""
URL configuration for DjangoProjectCode project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from django.shortcuts import HttpResponse
from book import views
from django.urls import reverse
# 默认的地址为:http://127.0.0.1:8000/
# 如果我想要访问默认地址下的其他内容,可以通过定义视图并将视图进行映射
def index(request):
print(reverse("movie:movie_list"))
# print(reverse("book_id")+"?id=1")
# print(reverse("book_path",kwargs={"book_id":1}))
# print(reverse("index"))
return HttpResponse("这是默认页面")
def my_page(request):
return HttpResponse("我的第一个Django项目,我们一定会顺利毕业滴!")
urlpatterns = [
path("admin/", admin.site.urls),
path("", index, name='index'), # 双引号中为空内容,表示为默认地址
path("mypage", my_page), # 自定义url
path("book", views.book_detail_query_id, name='book_id'),
# 在book_id前面添加指定参数类型,如果在浏览器中输入了非整型,会报404错误,并且在视图函数中,book_id就是一个整型,否则是字符串类型
path("book/<int:book_id>", views.book_detail_path, name='book_path'),
# 将movie app中的urls关联到项目urls中
path("movie/", include("movie.urls"))
]
运行项目并访问http://127.0.0.1:8000/得到: