Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在所有线程中重新加载python模块_Python_Django - Fatal编程技术网

在所有线程中重新加载python模块

在所有线程中重新加载python模块,python,django,Python,Django,我在Django上写了一些内容管理系统。用户可以使用各种URL创建页面。对于页面路由,我使用默认的django url路由器机制: pages = CMSHelpers().get_available_pages() urlpatterns = patterns( '', url(r'^$', include('app.home.site.urls', namespace='homepage')), url(r'^search/', include('app.searc

我在Django上写了一些内容管理系统。用户可以使用各种URL创建页面。对于页面路由,我使用默认的django url路由器机制:

pages = CMSHelpers().get_available_pages()

urlpatterns = patterns(
    '',
    url(r'^$', include('app.home.site.urls', namespace='homepage')),
    url(r'^search/', include('app.search.site.urls', namespace='search')),
    url(r'^ajax/', include('app.ajax.site.urls', namespace='ajax')),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

for page in pages:
    if page.module.slug:
        try:
            urlpatterns += patterns(
                '',
                url(
                    '^%s/' % page.url.strip('/'),
                    include(
                        'app.%s.site.urls' % page.module.slug,
                        namespace=page.module.slug + '-' + page.module_params
                    ),
                    kwargs={'page_data': page}
                )
            )
            logging.debug("Imported url %s for module %s" % (page.url.strip('/'), page.module.slug))
        except ImportError:
            logging.debug("Cannot import urls.py for module %s" % page.module.slug)
            continue
    else:
        continue

urlpatterns += patterns('',
    url(r'^captcha/', include('captcha.urls')),
)
问题:

当django应用程序启动时,python缓存所有urlpatterns。当用户通过CMS更改某个页面的url时,我正在重新加载url模式,但只针对当前的uwsgi进程/线程

    urlconf = settings.SUBDOMAIN_URLCONFS["www"]
    clear_url_caches()
    reload(sys.modules[urlconf])
    reloaded = import_module(urlconf)
    if hasattr(reloaded, 'urlpatterns'):
        reloaded_urls = getattr(reloaded, 'urlpatterns')
        set_urlconf(tuple(reloaded_urls))
所以,当用户试图访问站点上的此页面时,会出现随机404错误


那么,如何为所有uwsgi进程/线程重新加载模块

将用户创建的模式保存到数据库中

编写一些中间件来填充url模式,以便在每个页面请求上进行搜索


然后,您可以拥有任意数量的线程。我怀疑开销可以忽略不计。

考虑到像这样的web应用通常使用“无共享”架构,在每个请求上检查某种外部数据存储实际上是合理的。所述外部数据存储可以具有更新时间戳,每个工作线程/进程将其与自己的上次更新时间戳进行比较,并决定重新加载更新的模块


但是,更好的方法是为像
r'^(?p.*)/$”这样的页面包含一个catchall url模式,并将其路由到单个处理程序,该处理程序查找特定页面的处理程序应该是什么并调用它。

我遇到了完全相同的问题。我不想在每一个错过的URL上点击数据库。我只想在发生变化时重新加载URL

因为我们使用uwsgi来运行所有的django进程,所以我将通过向uwsgi进程发送HUP信号来强制从shell重新加载

在django进程中,我只想向父进程(即uwsgi进程)发送一个HUP信号。因此,我添加了这两行代码:

    import os, signal

    os.kill( os.getppid(), signal.SIGHUP )

我希望这有帮助

@SiHa,你是什么意思?难看的格式还是那样?谢谢,但这是我做的第一件事:)Django只在Django应用程序启动时读取urlpatterns。一次。我不想禁用模块缓存——这在性能方面很好,但我只想在需要时重新加载模块。因此,我不希望中间件覆盖每个请求的URL模式——在大型应用程序中会很慢。不过,重新加载(你的模块)的事情可能会变得很糟糕。我认为您需要在重新加载的模块中重新实例化对象的实例。您可以使用memcache跨线程共享信息,但必须有1个uwsgi进程,这并不理想。查看标题“共享全局数据”您需要为您的url模式找到某种共享存储我知道这很难看,但我不想失去默认的django路由机制(我喜欢),我想让用户能够使用各种url创建页面。reload(modulename)将只在当前线程中重新加载模块:(共享存储也很难看,应用程序将更依赖于平台。最简单的方法是通过subprocess.call()触摸wsgi文件来重新加载uwsgi服务器,但这也是最难看的:)杀死uwsgi真的是个坏主意:)我大约3年前提出了这个问题,现在我可以说,django不是为使用动态URL而设计的。使用静态URL并以Django的方式保存应用程序。这实际上并不会终止进程,而是发送HUP信号,通知它重新加载配置。流程保持不变。=)这个过程对我们来说非常有效。我们只从数据库加载URL一次,我们的动态URL工作得很好。