文档章节

django的单例模式和url分发

o
 osc_1ee7cxmx
发布于 2018/08/06 15:11
字数 573
阅读 7
收藏 0

精选30+云产品,助力企业轻松上云!>>>

python独有的特性引入模块后会执行一次模块的内容,并且生成pyc文件把引入的模块添加到pyc文件中,下次其他模块再调用相同的模块内容时会从pyc文件中读取不会重新执行并生成新的对象,这是python独有的一种单例模式!

django的admin.site就是用这种模式生成的单例对象,它贯穿django全局只要是在同一个程序下调用的admin.site都是同一个对象,使用admin.site.register注册的所有表名都会添加到一个以类对象为键,model_admin为值的字典中.

django中get_url源码:

def get_urls(self):
from django.urls import include, path, re_path
# 由于这个模块在应用程序的根包中导入
# 它不能从模块级的其他应用程序导入模型,
# and django.contrib.contenttypes.views imports ContentType.
from django.contrib.contenttypes import views as contenttype_views

def wrap(view, cacheable=False):
def wrapper(*args, **kwargs):
return self.admin_view(view, cacheable)(*args, **kwargs)
wrapper.admin_site = self
return update_wrapper(wrapper, view)

# Admin-site-wide views.
urlpatterns = [
path('', wrap(self.index), name='index'),
path('login/', self.login, name='login'),
path('logout/', wrap(self.logout), name='logout'),
path('password_change/', wrap(self.password_change, cacheable=True), name='password_change'),
path(
'password_change/done/',
wrap(self.password_change_done, cacheable=True),
name='password_change_done',
),
path('jsi18n/', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
path(
'r/<int:content_type_id>/<path:object_id>/',
wrap(contenttype_views.shortcut),
name='view_on_site',
),
]

# 添加每个模型的视图,并为其创建一个有效的url列表
# app_index
valid_app_labels = []
for model, model_admin in self._registry.items():
urlpatterns += [
path('%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
]
if model._meta.app_label not in valid_app_labels:
valid_app_labels.append(model._meta.app_label)

# 如果有模型管理员注册,我们应该有一个应用列表
# 我们需要允许访问appindex视图的标签
if valid_app_labels:
regex = r'^(?P<app_label>' + '|'.join(valid_app_labels) + ')/$'
urlpatterns += [
re_path(regex, wrap(self.app_index), name='app_list'),
]
return urlpatterns

Xadmin的路由分发:

url:
path('Xadmin/', (get_urls(), None, None)),

def test1(request):
return HttpResponse("这是test1的网页")
def search(request):
return HttpResponse("这是查的页面")
def add(request):
return HttpResponse("这是增的页面")
def change(request,nid):
return HttpResponse("这是改的页面")
def delete(request,nid):
return HttpResponse("这是删的页面")


def get_urls_two():
temp=[]
temp.append(re_path(r'^$',search))
temp.append(re_path(r'^add/$', add))
temp.append(re_path(r'^(\d+)/change/$', change))
temp.append(re_path(r'^(\d+)/delete/$', delete))
return temp


def get_urls():
temps = []
for model,admin_class in admin.site._registry.items():
app_name = model._meta.app_label #获取app的名字
model_name = model._meta.model_name #获取admin.site.registry注册的数据库表名的字符串形式
temps.append(re_path(r'^{}/{}/'.format(app_name,model_name),(get_urls_two(),None,None))) #路由分发必须传入元组第一个参数嵌套列表
return temps
 
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

OSChina 周一乱弹 —— 毛巾又怎么样?!我在乎的是大姐姐温柔的怀抱!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《雨 因你而下,于你而止》- Seto 手机党少年们想听歌,请使劲儿戳(这里) @Dan...

小小编辑
10分钟前
27
0
MySQL 常用操作

1 创建/打开/删除数据库 create database db;create database db character set utf8mb4;use db;drop database db;alter database db character set utf8mb4; 2 修复表 mysqlcheck --a......

氷泠
14分钟前
0
0
Node.js中的module.exports与export - module.exports vs exports in Node.js

问题: I've found the following contract in a Node.js module: 我在Node.js模块中找到了以下合同: module.exports = exports = nano = function database_module(cfg) {...} I wonder ......

javail
20分钟前
13
0
如何防止单击按钮时对话框关闭 - How to prevent a dialog from closing when a button is clicked

问题: I have a dialog with EditText for input. 我有一个使用EditText输入的对话框。 When I click the "yes" button on dialog, it will validate the input and then close the dialog.......

富含淀粉
50分钟前
17
0
访问者模式Visitor

一 概述 场景:通常来说,用于封装数据所用到的pojo类,其只包含get、set,对应的业务逻辑是在Service上完成的;但如果出现多个pojo类都共用一套逻辑时,则应该考虑将逻辑进行抽象,不同类型...

小明不觉小
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部