【问题标题】:Reload django url's without restarting the server在不重新启动服务器的情况下重新加载 django url
【发布时间】:2012-10-03 16:09:39
【问题描述】:

为什么?我想在路径的第一级有多个模型:)

使用:Django 1.4.1

代码设置网址:

PAGE_SLUGS = '|'.join(Page.objects.values_list('slug', flat=True))
BRAND_SLUGS = ... same concept
(r'^(?P<brand_slug>%s)/$' % BRAND_SLUGS, 'novomore.apps.catalog.views.product_showcase_list'),

url(r'^%s/$' % PAGE_SLUGS, 'prefab.apps.pages.views.page_detail', name='page'),

模型页面的save方法中:

if self.pk is None:
    clear_url_caches()

我不想对每个请求都运行查询,这就是我使用这种方法的原因,当我添加一个实例时,需要更新 PAGE_SLUGS。

clear_url_caches() 似乎不起作用

有什么建议吗?

这不起作用:

if settings.ROOT_URLCONF in sys.modules:
    reload(sys.modules[settings.ROOT_URLCONF])
    reload(importlib.import_module(settings.ROOT_URLCONF))

【问题讨论】:

    标签: django url caching urlconf


    【解决方案1】:

    来自How to reload Django's URL config

    import sys
    from django.conf import settings
    
    def reload_urlconf(self):
        if settings.ROOT_URLCONF in sys.modules:
            reload(sys.modules[settings.ROOT_URLCONF])
        return import_module(settings.ROOT_URLCONF)
    

    【讨论】:

    • 感谢您的回答,它仍然不起作用;我更新了帖子
    • 由于 Django 1.4 上 codeinthehole.com/writing/how-to-reload-djangos-url-config 中的 cmets 不起作用?
    • 您可能需要在使用 clear_url_caches() 重新加载 url 之前清除 url 缓存。
    • 我发现这个解决方案对我不起作用,因为单独应用程序中的 urls.py 也在动态更改,但 settings.ROOT_URLCONF 上的 reload 仅强制在项目主 @987654326 上重新加载@:不是应用程序级别的 urls.py 文件。因此,您可能希望遍历您的应用并重新加载它们的每个 urls.py
    【解决方案2】:

    我认为您尝试做的不是一个好主意。为什么不在 URL 正则表达式中简单地允许任何 slug 模式,但如果您找不到有问题的 Page 则返回 404?这将具有相同的效果并且更简单。

    url(r'^(?P<slug>\w+)/$', 'prefab.apps.pages.views.page_detail', name='page'),
    

    那么你的视图代码可以做类似的事情

    from django import shortcuts
    
    def page_detail(request, slug):
        page = shortcuts.get_object_or_404(Page, slug=slug)
        ... 
    

    【讨论】:

    • 那是我在做的事情,但我希望在第一级有多个对象,而不是每个传入请求的一个或多个查询.. 检查我的初始帖子,我添加了一个 BRAND_SLUGS 示例
    最近更新 更多