Django之URL分发
我们知道在 Django 中有一个专门的 urls.py 文件用于配置 URL 规则,转发到后端的 views.py,但是当我们有非常多的 URL 或者一个项目中有多个应用,这时候我们就希望把 URL 分开,避免 URL 太多造成项目混乱。
URL 分发有两种方式:
- 通过 include 方法
- 通过 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)),
]
2
3
4
5
6
# 元组嵌套
urlpatterns = [
url(r'^blog/', ([
url(r'^test01/', test01),
url(r'^test02/', test02),
], None, None)),
]
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))
]
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)
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) 许可协议。转载请注明出处!
- 02
- 使用Zadig从0到1实现持续交付平台07-19
- 03
- 基于Jira的运维发布平台07-19