我们都知道,可以在 settings模块中设置 根URLConf,但如果某些请求不想将其当作入口,想自定义请求的 URLConf 入口,就可以通过中间件来设置
下面来演示
1. 创建应用并
新建两个应用 student 和 teacher
python manage.py startapp student
python manage.py startapp teacher
两个应用下,分别新建一个 urls.py
student/views.py 编写视图函数
from django.http import HttpResponse
def home(request):
return HttpResponse('student home')
def about(request):
return HttpResponse('student about')
def user(request):
return HttpResponse('student user')
teacher/views.py 中编写函数
from django.http import HttpResponse
def home(request):
return HttpResponse('teacher home')
def about(request):
return HttpResponse('teacher about')
def user(request):
return HttpResponse('teacher user')
然后分别编写路由规则
student/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('home/', views.home),
path('about/', views.home),
path('user/', views.home),
]
teacher/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('teacher/home/', views.home),
path('teacher/about/', views.home),
path('teacher/user/', views.home),
]
2. 编写中间件
首先在 settings.py 中设置 ROOT_URLCONF 为 student
ROOT_URLCONF = 'student.urls'
此时所有的请求,都会匹配 student/urls 中的路由规则
项目根目录下,新建 middleware 目录
其中新建 urlcon.py,文件中新建类 UrlconfMiddleware,代码如下
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
import re
class UrlconfMiddleware(MiddlewareMixin):
def process_request(self, request):
if request.path.startswith('/teacher'):
request.urlconf = 'teacher.urls'
return
如果请求的 path 中以 teacher 开头,则直接匹配 teacher.urls 不再受根 ROOT_URLCONF 控制