乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

  • AIOps

  • Python

    • 基础知识

    • Django框架

      • Django之框架
      • Django之ORM详解
      • Django之操作ORM
      • Django之操作ORM例子
      • Django之路由系统
      • Django之跨站请求伪造
      • Django之Cookie和Session
      • Django之CBV和FBV
      • Django之中间件
      • Django之用户认证系统
      • Django之Form组件
      • Django之Ajax
      • Django之模板语言
      • Django之URL分发
        • include 方法
        • 元组嵌套
      • Django中的缓存
      • Models迁移原理
      • 自定义组件Xadmin
      • Markdown 富文本插件
      • 手写一个验证码
    • 其他

  • DevOps

  • 专栏
  • Python
  • Django框架
乔克
2025-07-19
目录

Django之URL分发

我们知道在 Django 中有一个专门的 urls.py 文件用于配置 URL 规则,转发到后端的 views.py,但是当我们有非常多的 URL 或者一个项目中有多个应用,这时候我们就希望把 URL 分开,避免 URL 太多造成项目混乱。

URL 分发有两种方式:

  1. 通过 include 方法
  2. 通过 url 嵌套

# include 方法

比如我们有一个应用 blog,在其里面添加一个 urls.py,所有访问 blog 应用的规则都到该应用本身的 urls.py 进行处理,这时候我们就可以在工程的 urls.py 中进行如下配置:

from django.conf.urls import url, include
from blog import urls as blog_urls
## 将所有以blog开头的路由转发到blog.urls下执行
urlpatterns = [
    url(r'^blog/', include(blog_urls)),
]
1
2
3
4
5
6

# 元组嵌套

urlpatterns = [
    url(r'^blog/', ([
    	url(r'^test01/', test01),
        url(r'^test02/', test02),
    	], None, None)),
]
1
2
3
4
5
6

这样就可以通过 blog/test01 以及 blog/test02 进行访问。

例子:

设计如下 URL:

127.0.0.1:8000/Xadmin/app01/book/

127.0.0.1:8000/Xadmin/app01/book/add/

127.0.0.1:8000/Xadmin/app01/book/1/change/
127.0.0.1:8000/Xadmin/app01/book/1/delete/

代码如下:

from django.conf.urls import url
from django.contrib import admin
from django.shortcuts import HttpResponse


def list_view(request):
    return HttpResponse("list_view")

def delete_view(request, id):
    return HttpResponse("delete_view")

def add_view(request):
    return HttpResponse("add_view")

def change_view(request, id):
    return HttpResponse("change_view")


def get_operate_urls():
    """
    分发操作的urls
    :return:
    """
    operate_urls_list = []
    operate_urls_list.append(url(r'^$', list_view))
    operate_urls_list.append(url(r'^add/$', add_view))
    operate_urls_list.append(url(r'^(\d+)/change/$', change_view))
    operate_urls_list.append(url(r'^(\d+)/delete/$', delete_view))
    return operate_urls_list


def get_urls():
    urls_list = []
    ## 循环分别取出注册的信息,拼接成url
    for model, admin_class_obj in admin.site._registry.items():
        app_name = model._meta.app_label
        model_name = model._meta.model_name
        urls_list.append(url(r'{0}/{1}/'.format(app_name, model_name), (get_operate_urls(), None, None)))
    return urls_list


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^Xadmin/', (get_urls(), None, None))
]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

其中第一个 get_urls 方法是用于获取 app_name/model_name,他们分别通过 model 模型类中的_meta.app_label 和_meta.model_name 获取。

第二个 get_operate_urls 方法用于分发操作的 urls。

题外:

当外面在 admin.py 中注册后,代码如下:

from django.contrib import admin

## Register your models here.
from app01 import models
admin.site.register(models.UserInfo)
admin.site.register(models.Article)
admin.site.register(models.Article2Tag)
admin.site.register(models.ArticleDetail)
admin.site.register(models.ArticleUpDown)
admin.site.register(models.Blog)
admin.site.register(models.Category)
admin.site.register(models.Comment)
admin.site.register(models.Tag)
1
2
3
4
5
6
7
8
9
10
11
12
13

然后其信息就会以字典的形式保存在 admin.site._registry 中,其中键是 ModelClass,值是 admin_class(ModelClass, self)。

作者:乔克

本文链接:https://jokerbai.com

版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!

上次更新: 2025/07/19, 11:33:23
Django之模板语言
Django中的缓存

← Django之模板语言 Django中的缓存→

最近更新
01
使用 Generic Webhook Trigger 触发 Jenkins 多分支流水线自动化构建
07-19
02
使用Zadig从0到1实现持续交付平台
07-19
03
基于Jira的运维发布平台
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式