Python 在Django中以编程方式添加URL模式?

Python 在Django中以编程方式添加URL模式?,python,django,django-admin,django-urls,django-settings,Python,Django,Django Admin,Django Urls,Django Settings,有没有一种方法可以通过编程将URL模式添加到Django,而无需重新启动服务器 或者有没有办法强迫Django重新处理/缓存URL模式(URLconf)?如果您使用gunicorn而不进行代码预加载,只需向gunicorn主进程发送一个HUP,它就会产生新的工作进程来加载新代码,并优雅地关闭旧的工作进程,而不会丢失一个请求 我在django.core.urlResolver中黑客攻击了一些东西,尝试了类似的方法——这对我来说很有效,但请注意,这是一种黑客攻击。我还没有代码,但我做了如下操作: D

有没有一种方法可以通过编程将URL模式添加到Django,而无需重新启动服务器


或者有没有办法强迫Django重新处理/缓存URL模式(URLconf)?

如果您使用gunicorn而不进行代码预加载,只需向gunicorn主进程发送一个HUP,它就会产生新的工作进程来加载新代码,并优雅地关闭旧的工作进程,而不会丢失一个请求

我在
django.core.urlResolver
中黑客攻击了一些东西,尝试了类似的方法——这对我来说很有效,但请注意,这是一种黑客攻击。我还没有代码,但我做了如下操作:

  • Django通常使用
    UrlResolver.get_resolver()
    来获取负责解析URL的
    RegexURLResolver
    。将
    None
    传递到此函数将获得“根”URLConf
  • get\u resolver()
    为加载的URLConf使用缓存
    \u resolver\u cache
  • 重置
    \u解析器\u缓存
    应强制Django重新创建干净的URL解析器
  • 或者,您可以尝试取消设置根
    RegexURLResolver
    \u urlconf\u module
    属性,这将强制Django重新加载它(但对此不确定,该模块可能会被Python缓存)

    同样,也不能保证这会起作用(我是从内存中工作的,显然是出于某种原因而丢弃的代码)。但是django/core/urlresolvers.py绝对是您想要查看的文件

    编辑:决定对此进行一些实验,但没有成功

    EDIT2:

    正如我所想,您的URL模块将由Python缓存。只要在它们更改时重新加载它们就可以了(使用
    重新加载
    )。如果,您的问题是,您正在基于一些可能更改的数据动态构建
    urlpatterns

    我尝试重新加载我的根URL(project.url)和子URL模块(app.url)。这就是我要通过
    get\u解析器(None)显示新url所要做的一切


    因此,诀窍可能很简单:手动重新加载URL模块。

    这也是一种优雅的方式:

    只需执行此操作即可重新加载根URL模块:

    reload_urlconf()
    
    以下是你的答案:

    import sys
    from django.conf import settings
    from importlib import reload
    from django.urls import clear_url_caches
    
    urlconf = settings.ROOT_URLCONF
      if urlconf in sys.modules:
          clear_url_caches()
          reload(sys.modules[urlconf])
    

    您是否正在使用
    mod_wsgi
    ?如果是这样,您可以在不重新启动整个Apache服务器的情况下重新启动应用程序。@S.Lott对于生产服务器是的,因此这可能会起作用,您如何重新启动特定的应用程序?dev server有类似的功能吗?@S.Lott,对于“dev server”,我指的是Django附带的内置开发服务器,例如:python manage.py runserver。不过,我可能误解了你的第一个评论,你是说可以在不重新启动其他应用程序的情况下重新启动一个Django应用程序,还是说可以在不重新启动Apache的情况下重新启动Django/所有应用程序?我需要做前者。Django附带的内置开发服务器在您更改代码时会自动重新启动。如果您使用
    mod_wsgi
    ,当您触摸
    wsgi
    文件时,生产服务器会自动重启?这可能意味着什么?Django启动时,
    urls.py
    只读取一次,如果不重新启动Django,则无法重新读取。如果有机会,我将尝试一下,看看它是否有效。如何
    重新加载
    ?此
    重新加载
    功能来自何处?这还不清楚你的黑客程序不适用于django 2.1
    import sys
    from django.conf import settings
    from importlib import reload
    from django.urls import clear_url_caches
    
    urlconf = settings.ROOT_URLCONF
      if urlconf in sys.modules:
          clear_url_caches()
          reload(sys.modules[urlconf])