Python 在Django中以编程方式添加URL模式?
有没有一种方法可以通过编程将URL模式添加到Django,而无需重新启动服务器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
或者有没有办法强迫Django重新处理/缓存URL模式(URLconf)?如果您使用gunicorn而不进行代码预加载,只需向gunicorn主进程发送一个HUP,它就会产生新的工作进程来加载新代码,并优雅地关闭旧的工作进程,而不会丢失一个请求 我在
django.core.urlResolver
中黑客攻击了一些东西,尝试了类似的方法——这对我来说很有效,但请注意,这是一种黑客攻击。我还没有代码,但我做了如下操作:
UrlResolver.get_resolver()
来获取负责解析URL的RegexURLResolver
。将None
传递到此函数将获得“根”URLConfget\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])