1 路由分发
- 随着我们的App应用的增多,在全局urls中,不能写很多的url在全局的urls.py中
- 这时我们就会用到路由分发技术,将各个App自己的url分配到自己的urls.py中
比如我们现在有两个App,app01和app02,相应的设置如下:
1.1 设置分发器
1.在全局的urls.py中配置
# re_path ==> 2.0版本 path是最新版本(支持2.0的语法,也有自己的新语法)
from django.contrib import admin
from django.urls import path, re_path, include
from app01 import views
urlpatterns = [
# path('admin/', admin.site.urls),
path('timer/', views.timer), # views.timer(request)
path('login/', views.login, name="log"),
# 简单的路由配置:路径 ---- 视图函数
# 路由分发
re_path(r"app01/", include(("app01.urls", "app01"))),
re_path(r"app02/", include(("app02.urls", "app02"))),
]
注意: 在这里include接收的是一个元组
参数1:App的urls.py文件
参数2:App的别名
错误写法: re_path(r’^MyWeb/’, include(“MyWeb.urls”, namespace=“MyWeb”)),
正确写法: re_path(r"^MyWeb/", include((“MyWeb.urls”, “MyWeb”)))
2.在各自App应用的urls.py文件中:
# App01 --> urls.py
from django.urls import path, re_path
from app01 import views
urlpatterns = [
# 简单的路由配置:路径 ---- 视图函数
re_path("index/", views.index, name='index')
]
# App02 --> urls.py
from django.urls import path, re_path
from app02 import views
urlpatterns = [
# 简单的路由配置:路径 ---- 视图函数
re_path("index/", views.index, name='index')
]
3.在各自的视图函数views.py文件中:
# App01 --> views.py
from django.urls import reverse # 导入反向解析函数
def index(request):
return HttpResponse(reverse('app01:index'))
# App02 --> views.py
from django.urls import reverse # 导入反向解析函数
def index(request):
return HttpResponse(reverse('app02:index'))
- 注意:
reverse('app02:index')
--> 中的 ‘app02:index’ 指的是app02名称空间下的index,app01就是app01名称空间下的index
总结: reverse()
:函数是用来反向解析我们的url的,下面我们看看反向解析
2 反向解析
反向解析:就是给我们的url路径起别名
示例:
# 全局urls.py文件
from django.contrib import admin
from django.urls import path, re_path, include
from app01 import views
urlpatterns = [
# path('admin/', admin.site.urls),
# path('timer/', views.timer), # views.timer(request)
path('login/', views.login, name="log"),
]
- 在上面代码中,我们为login的url起了一个log的别名
- 起别名的作用,是为了将我们的url映射到HTML页面form表单的
action="{% url 'log' %}
属性中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{#action:路径或者行为,如果不写ip跟端口,默认用现在的ip和端口#}
<form action="{% url 'log' %}" method="post">
用户名 <input type="text" name="user">
密码 <input type="password" name="pwd">
<button type="submit">登录</button>
</form>
</body>
</html>
这样一来,我们即使更改了我们的url,只要别名没有变,HTML页面中也能找到对应的url