zoukankan      html  css  js  c++  java
  • stark

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

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

    1 from django.apps import AppConfig
    2 from django.utils.module_loading import autodiscover_modules
    3 
    4 class StarkConfig(AppConfig):
    5     name = 'stark'
    6 
    7     def ready(self):
    8         autodiscover_modules('stark')

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


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

    ⒉、单例模式

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

     1 def include(arg, namespace=None):
     2     app_name = None
     3     if isinstance(arg, tuple):
     4         # Callable returning a namespace hint.
     5         try:
     6             urlconf_module, app_name = arg
     7         except ValueError:
     8             if namespace:
     9                 raise ImproperlyConfigured(
    10                     'Cannot override the namespace for a dynamic module that '
    11                     'provides a namespace.'
    12                 )
    13             raise ImproperlyConfigured(
    14                 'Passing a %d-tuple to include() is not supported. Pass a '
    15                 '2-tuple containing the list of patterns and app_name, and '
    16                 'provide the namespace argument to include() instead.' % len(arg)
    17             )
    18     else:
    19         # No namespace hint - use manually provided namespace.
    20         urlconf_module = arg
    21 
    22     if isinstance(urlconf_module, str):
    23         urlconf_module = import_module(urlconf_module)
    24     patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
    25     app_name = getattr(urlconf_module, 'app_name', app_name)
    26     if namespace and not app_name:
    27         raise ImproperlyConfigured(
    28             'Specifying a namespace in include() without providing an app_name '
    29             'is not supported. Set the app_name attribute in the included '
    30             'module, or pass a 2-tuple containing the list of patterns and '
    31             'app_name instead.',
    32         )
    33     namespace = namespace or app_name
    34     # Make sure the patterns can be iterated through (without this, some
    35     # testcases will break).
    36     if isinstance(patterns, (list, tuple)):
    37         for url_pattern in patterns:
    38             pattern = getattr(url_pattern, 'pattern', None)
    39             if isinstance(pattern, LocalePrefixPattern):
    40                 raise ImproperlyConfigured(
    41                     'Using i18n_patterns in an included URLconf is not allowed.'
    42                 )
    43     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 属性,那么子路由就是第一个参数。

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

    1 urlpatterns = [
    2     url(r'^web/', ([
    3         url(r'^index/', views.index),
    4         url(r'^home/', views.home),
    5     ], app_name, namespace)), # 第一个参数是urls文件对象,通过此对象可以获取urls.patterns获取分发的路由。
    6 ]
  • 相关阅读:
    JMeter笔记:关于时间函数_time的简单使用(时间戳、时间)
    搜索&分页功能主要测试点
    JMeter笔记十五:逻辑控制器之临界部分控制器(Critical Section Controller)
    JMeter笔记十四:Beanshell取样器
    Python3+RobotFramework自动化测试十:接口测试
    Github Pages中的Octopress框架搭建个人博客(下)
    pycharm破解
    计算机网络 UDP协议
    计算机网络 路由器协议
    计算机网络 TCP协议
  • 原文地址:https://www.cnblogs.com/steven2020/p/10691719.html
Copyright © 2011-2022 走看看