文章目录
1. 项目目录
这一节我们需要在原有的目录下,创建 models/urls.py
,在各自的APP下完成路由的一些操作
2. 路由分发
存在问题:
Django 项目里多个app目录共用一个 urls 容易造成混淆,后期维护也不方便
解决:
使用路由分发(include),让每个app目录都单独拥有自己的 urls
步骤:
- 在每个 app 目录里都创建一个
urls.py
文件。 - 在项目名称目录下的 urls 文件里,统一将路径分发给各个
app
目录
2.1 全局路径分发到APP
在项目的根目录下 myFirstDjango/urls.py
中填写路由分发规则
from django.urls import path, include # 从 django.urls 引入 include
# 此项就是django的url配置
"""
path('models/', include('models.urls')) include 路由分发
相当于flask框架的蓝图,把请求分开到不同的app中,方便后期维护
models/ : 相当于访问项目时根路径下一层的请求名字 http://localhost:8080/models/
注意必须添加最后的 / 不然路径不通
include('models.urls') : 引入了 models APP中的 urls.py文件,这样的话django框架
就知道去哪里找你的映射路径了,浏览器输入http://localhost:8080/models/XXX
django就会去 models/urls.oy去找你的下一层请求地址
"""
urlpatterns = [
path('models/', include('models.urls'))
]
2.2 APP定义自己的路由转发规则
在 models/urls.py
中写自己APP的路由规则即可
from django.urls import path
# 路由分发就每个模块都引入自己的 urls.py 和 views.py 文件
from models import views # 在models APP中 引入的 models/views.py
# 此项就是django的url配置
"""
path('url_include', views.url_include)
path('url_include' : 这里的 url_include 是第二层路径的名称
views.url_include) : 第一个参数路径名称指向的视图函数是 views.py/url_include 函数
第一层/第二层
完整路径为 : http://localhost:8080/models/url_include
"""
urlpatterns = [
path('url_include', views.url_include),
]
在 models/views.py
中添加如下代码
from django.shortcuts import HttpResponse
def url_include(request):
return HttpResponse("我是models下的urls.py 经过路由分发转发过来的请求视图")
浏览器输入完整路径 http://localhost:8080/models/url_include
可以看到浏览器路径不是从根路径就下发请求,中间定义了一个models,这就是路由分发,通过不同APP的urls 和 views,可以定义不同的路径分发规则,不再是所有的代码都写在一个文件里了,后期维护非常的方便
3. 反向解析
随着功能的增加,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作,反向解析一般用在模板中的超链接及视图中的重定向
3.1 视图反向解析
在 models/urls.py
修改为以下内容
urlpatterns = [
path('url_include', views.url_include),
# 添加名称,不管 path的地址怎么变,都能通过 login这个名字反向解析到视图函数中
path('to_login'