⒈、django项目启动时,自定义执行某个py文件。

在任意的app的apps.py中的Config类中定义ready方法,并调用autodiscover_modules

 from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules class StarkConfig(AppConfig):
name = 'stark' def ready(self):
autodiscover_modules('stark')

django在启动时,就会去已注册的所有app的目录下找 apps.py 并自动导入。

如果执行两次,是因为django内部自动重启导致:
    python manage.py runserver 120.0.0.1:8001 --noreload

⒉、单例模式

通过利用Python模块导入的特性:在Python中,如果已经导入过的文件再次被重新导入时候,python不会再重新解释一遍,而是选择从内存中直接将原来导入的值拿来用。

 def include(arg, namespace=None):
app_name = None
if isinstance(arg, tuple):
# Callable returning a namespace hint.
try:
urlconf_module, app_name = arg
except ValueError:
if namespace:
raise ImproperlyConfigured(
'Cannot override the namespace for a dynamic module that '
'provides a namespace.'
)
raise ImproperlyConfigured(
'Passing a %d-tuple to include() is not supported. Pass a '
'2-tuple containing the list of patterns and app_name, and '
'provide the namespace argument to include() instead.' % len(arg)
)
else:
# No namespace hint - use manually provided namespace.
urlconf_module = arg if isinstance(urlconf_module, str):
urlconf_module = import_module(urlconf_module)
patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
app_name = getattr(urlconf_module, 'app_name', app_name)
if namespace and not app_name:
raise ImproperlyConfigured(
'Specifying a namespace in include() without providing an app_name '
'is not supported. Set the app_name attribute in the included '
'module, or pass a 2-tuple containing the list of patterns and '
'app_name instead.',
)
namespace = namespace or app_name
# Make sure the patterns can be iterated through (without this, some
# testcases will break).
if isinstance(patterns, (list, tuple)):
for url_pattern in patterns:
pattern = getattr(url_pattern, 'pattern', None)
if isinstance(pattern, LocalePrefixPattern):
raise ImproperlyConfigured(
'Using i18n_patterns in an included URLconf is not allowed.'
)
return (urlconf_module, app_name, namespace)

include函数 源码

返回值是由含有三个元素的元祖 (urlconf_module, app_name, namespace)

⒊、django路由分发的本质:include

from django.conf.urls import url,include
from app01 import urls 以往写的include函数实现路由分发
urlpatterns = [
  url(r'^rbac/',include(('rbac.urls','rbac'),namespace='rbac'))
 ] 其实,include函数主要返回有三个元素的元组。
urlpatterns = [
url(r'^web/', (urls, app_name, namespace)), # 第一个参数是urls文件对象,通过此对象可以获取urls.patterns获取分发的路由。
]      在源码内部,读取路由时:
          如有第一个参数有:urls.patterns 属性,那么子路由就从该属性中后去。
          如果第一个参数无:urls.patterns 属性,那么子路由就是第一个参数。

综合以上,自己实现的路由分发方式:

 urlpatterns = [
url(r'^web/', ([
url(r'^index/', views.index),
url(r'^home/', views.home),
], app_name, namespace)), # 第一个参数是urls文件对象,通过此对象可以获取urls.patterns获取分发的路由。
]

最新文章

  1. C# Winform代码片段-大二下学期的垃圾代码
  2. 隐藏ASP.NET站点的HTTP Headers
  3. Linux系统性能分析
  4. 苹果系统里面部署ASP.NET
  5. mysql格式化整数类型时间生成年月日时分秒格式(long或string接收)
  6. php解析一个url
  7. jQuery 遍历(上)
  8. [转载]寻找两个有序数组中的第K个数或者中位数
  9. mac OS X下git代码行统计命令
  10. IE6、火狐不支持a:visited
  11. NFinal 视图—模板
  12. 在linux中配置tomcat
  13. 导航栏控制器和标签栏控制器(UINavigationController和UITabBarController)混用
  14. 安装arm-linux-gcc交叉编译器
  15. PS小实验-去除水印
  16. dev gridControl 自定义绘制列头颜色
  17. 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法
  18. Spring中的资源加载
  19. (纠错)JSP数据库判断是否存在
  20. Ansible Callback

热门文章

  1. CMDB小练习
  2. 在windows上编译wireshark源代码
  3. sql 两大类 DDL数据定义语言 和DCL数据控制语言
  4. XJOI 3605 考完吃糖(DAG图dfs)
  5. phpize命令在安装AMQP插件是报错phpize:Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF envir的解决方法
  6. eclipse配置tomcat 8.0.24服务器
  7. xml构建
  8. 键盘控制背景边框平滑移动(jquery)
  9. C# 编写的SqlServer 数据库自动备份服务,带配置,功能强大
  10. 13种PDF转图片的案列