网站用哪种语言,中小学智慧校园建设平台网站,wordpress新手基础入门视频教程,小说短篇做的好的网站1. 路由基础概念
URLconf (URL 配置)#xff1a;Django 的路由系统是基于 urls.py 文件定义的。路径匹配#xff1a;通过模式匹配 URL#xff0c;并将请求传递给对应的视图处理函数。命名路由#xff1a;每个路由可以定义一个名称#xff0c;用于反向解析。 2. 基本路由配…1. 路由基础概念
URLconf (URL 配置)Django 的路由系统是基于 urls.py 文件定义的。路径匹配通过模式匹配 URL并将请求传递给对应的视图处理函数。命名路由每个路由可以定义一个名称用于反向解析。 2. 基本路由配置
示例 urls.py 文件
from django.urls import path
from . import viewsurlpatterns [path(, views.home, namehome), # 根路径path(about/, views.about, nameabout), # 静态路径path(article/int:id/, views.article_detail, namearticle-detail), # 动态参数
] # views.pyfrom django.http import HttpResponsedef home(request):return HttpResponse(Welcome to the Home page!)def about(request):return HttpResponse(This is the About page.)def article_detail(request, id):return HttpResponse(fArticle Detail for Article {id}) path() 函数 第一个参数URL 模式。第二个参数对应的视图函数。第三个参数可选name 用于反向解析。 3. 动态路由
动态路由允许在 URL 中传递参数。
示例
urlpatterns [path(user/int:user_id/, views.user_profile, nameuser-profile), # 整数参数path(post/slug:slug/, views.post_detail, namepost-detail), # 字符串参数path(date/int:year/int:month/, views.archive, namearchive), # 多参数
] # views.py
from django.http import HttpResponsedef user_profile(request, user_id):return HttpResponse(fUser Profile for user {user_id})def post_detail(request, slug):return HttpResponse(fPost Detail for post {slug})def archive(request, year, month):return HttpResponse(fArchive for {year}-{month}) 支持的路径转换器
转换器描述示例str匹配任意非空字符串默认类型hello/int匹配正整数123/slug匹配字母、数字、- 和 _my-post-slug/uuid匹配 UUID 格式550e8400-e29b-...path匹配包含 / 的字符串some/path/ 4. 子路由与 include
Django 推荐在大型项目中将路由分模块管理。
示例主路由
from django.urls import path, includeurlpatterns [path(blog/, include(blog.urls)), # 引入子路由path(shop/, include(shop.urls)), # 引入另一个应用的路由
]
示例子路由blog/urls.py
from django.urls import path
from . import viewsurlpatterns [path(, views.blog_home, nameblog-home),path(int:post_id/, views.blog_post, nameblog-post),
] # blog/views.pyfrom django.http import HttpResponsedef blog_home(request):return HttpResponse(Welcome to the blog home page.)def blog_post(request, post_id):return HttpResponse(fBlog Post with ID {post_id})
URL /blog/ 和 /blog/123/ 将分别被子路由处理。 5. 命名空间
在大型项目中为不同应用的路由定义命名空间避免路由名称冲突。
主路由配置
from django.urls import path, includeurlpatterns [path(blog/, include((blog.urls, blog), namespaceblog)), # 定义命名空间
]
子路由配置blog/urls.py
from django.urls import path
from . import viewsapp_name blog # 命名空间urlpatterns [path(, views.home, namehome),path(int:post_id/, views.post_detail, namepost-detail),
]使用反向解析
from django.urls import reverse# 使用命名空间解析路由
url reverse(blog:post-detail, kwargs{post_id: 1}) # 返回 /blog/1/6. 正则表达式路由
如果路径匹配需要更复杂的规则可以使用 re_path支持正则表达式。
* 示例: 在2.x以上版本 无名分组 有名分组 可以用 re_path 实现
# urls.pyfrom django.urls import re_path
from . import viewsurlpatterns [# 无名分组re_path(r^page/(\d)/$, views.page_view, namepage-view),# 有名分组re_path(r^page/(?Ppage_number\d)/$, views.page_view, namepage-view),
]
路径 /page/123/ 会被捕获为 page_number123。 # views.pyfrom django.http import HttpResponsedef page_view(request, page_number):return HttpResponse(fPage number: {page_number}) 7. 路由中的默认值
可以为动态路由提供默认值以减少 URL 的复杂度。
示例
from django.urls import path
from . import viewsurlpatterns [path(profile/str:username/, views.profile, nameprofile),path(profile/, views.profile, {username: default_user}, namedefault-profile),
]
请求 /profile/ 将自动解析为 usernamedefault_user。 # views.pyfrom django.http import HttpResponsedef profile(request, usernamedefault_user):return HttpResponse(fUser profile: {username}) 8. 类视图的路由
在路由中可以直接绑定类视图。
示例
# urls.pyfrom django.urls import path
from .views import HomeView, ArticleViewurlpatterns [path(, HomeView.as_view(), namehome),path(article/int:pk/, ArticleView.as_view(), namearticle-detail),
]
类视图必须使用 .as_view() 方法绑定。 # views.pyfrom django.views import View
from django.http import HttpResponseclass HomeView(View):def get(self, request):return HttpResponse(Welcome to the Home page!)class ArticleView(View):def get(self, request, pk):return HttpResponse(fArticle Detail for Article {pk}) 9. 自定义路由转换器
Django 支持自定义路径转换器用于处理特定格式的路径。
定义自定义转换器
在 converters.py 中
class FourDigitYearConverter:regex r\d{4}def to_python(self, value):return int(value)def to_url(self, value):return f{value}局部注册转换器
在 urls.py 中
from django.urls import path, register_converter
from .converters import FourDigitYearConverterregister_converter(FourDigitYearConverter, yyyy)urlpatterns [path(year/yyyy:year/, views.year_archive, nameyear-archive),
]请求 /year/2024/ 将解析为 year2024。 * 也可以用继承 导包 from django.urls.converters import StringConverterclass FourDigitYearConverter(StringConverter):regex r\d{4}def to_python(self, value):return int(value)def to_url(self, value):return f{value} * 全局注册 from django.urls.converters import StringConverter, DEFAULT_CONVERTERSDEFAULT_CONVERTERS[yyyy] FourDigitYearConverter # views.pyfrom django.http import HttpResponsedef year_archive(request, year):return HttpResponse(fYear Archive for {year}) 10. 静态文件与媒体文件路由
Django 开发模式下可以通过路由处理静态文件和媒体文件。
配置 settings.py
from pathlib import PathBASE_DIR Path(__file__).resolve().parent.parentSTATIC_URL /static/
MEDIA_URL /media/STATICFILES_DIRS [BASE_DIR / static]
MEDIA_ROOT BASE_DIR / media
配置 urls.py
from django.conf import settings
from django.conf.urls.static import staticurlpatterns [# 其他路由
] static(settings.MEDIA_URL, document_rootsettings.MEDIA_ROOT) 总结
Django 路由是通过 urls.py 文件进行管理的支持以下特性
静态和动态路由支持静态路径和动态参数传递。子路由与命名空间方便模块化管理避免路由名称冲突。反向解析通过路由名称动态生成 URL。自定义转换器处理自定义路径格式。正则表达式路由支持复杂路径匹配。
路由系统是 Django 项目请求处理的起点合理设计路由结构能显著提高项目的可维护性 * 11. 前后端反向解析
解析方式方法示例代码解析结果前端解析{% url route-name %}a href{% url about %}About/a/about/后端解析reverse(route-name)reverse(about)/about/动态参数reverse/{% url %}reverse(article-detail, kwargs{id: 42})/article/42/命名空间reverse/{% url %}{% url blog:post-detail post_id5 %}/blog/5/延迟解析reverse_lazyreverse_lazy(profile, kwargs{...})/profile/...