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
如何在Django rest框架中动态切换URL_Django_Django Rest Framework_Featuretoggle - Fatal编程技术网

如何在Django rest框架中动态切换URL

如何在Django rest框架中动态切换URL,django,django-rest-framework,featuretoggle,Django,Django Rest Framework,Featuretoggle,我正在从事一个项目,在这个项目中,我们使用功能切换来隐藏功能,直到它们准备发布 我们遵循的模式是,如果功能切换处于关闭状态,则不路由某些端点。也就是说,在urls.py中,如果切换处于启用状态,我们仅在urlconf中包含URL。但这意味着功能切换只有在服务器重新启动时才会生效。我们希望能够在运行的服务器上动态地打开和关闭功能切换。似乎只有在启动时才会解析urlconf,因此在不重新启动的情况下不会反映对它的更改 我曾尝试制作一个中间件,根据功能切换的值来阻止某些URL,这很有效,但不能很好地处

我正在从事一个项目,在这个项目中,我们使用功能切换来隐藏功能,直到它们准备发布

我们遵循的模式是,如果功能切换处于关闭状态,则不路由某些端点。也就是说,在
urls.py
中,如果切换处于启用状态,我们仅在
urlconf
中包含URL。但这意味着功能切换只有在服务器重新启动时才会生效。我们希望能够在运行的服务器上动态地打开和关闭功能切换。似乎只有在启动时才会解析
urlconf
,因此在不重新启动的情况下不会反映对它的更改

我曾尝试制作一个中间件,根据功能切换的值来阻止某些URL,这很有效,但不能很好地处理
Swagger
docs,我还想反映功能切换的状态

总的来说,我感觉自己在与这个系统抗争,这通常是一个信号,表明我没有从正确的角度接近它

那么,人们如何建议我在Django中实现行为的动态特性切换呢

编辑:我的意思是说我看过一些帖子,比如这篇:但实际上没有任何解决方案


一些甚至更老的帖子谈到通过重新加载模块来强制刷新
urlconf
,我已经尝试过了,但是,尽管我可以看到代码再次执行,但它似乎不会影响URL。就像它们被缓存了一样,但我找不到任何方法来清除缓存(我在该主题上找到的所有帖子都已过时)

在url.py中包含所有URL。然后将if-else重定向添加到中间件

我不清楚是有很多切换/url选项还是只有一个,但听起来你已经有了存储和查找这些信息的方法

class BeforeViewMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):

        path = request.path

        # look up toggle option, urls in dynamic place. I use a DB table; you said in comments you use Constance 

        if <toggle is off and url is in toggle-on options only>: # depends on how you store this info
             return HttpResponseRedirect("<other url or some error page, whatever>")
class BeforeViewMiddleware(对象):
def进程视图(自身、请求、视图函数、视图参数、视图参数):
path=request.path
#查找切换选项,URL处于动态位置。我使用DB表;你在评论中说你用康斯坦斯
如果:#取决于您存储此信息的方式
返回HttpResponseRedirect(“”)

在url.py中包含所有URL。然后将if-else重定向添加到中间件

我不清楚是有很多切换/url选项还是只有一个,但听起来你已经有了存储和查找这些信息的方法

class BeforeViewMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):

        path = request.path

        # look up toggle option, urls in dynamic place. I use a DB table; you said in comments you use Constance 

        if <toggle is off and url is in toggle-on options only>: # depends on how you store this info
             return HttpResponseRedirect("<other url or some error page, whatever>")
class BeforeViewMiddleware(对象):
def进程视图(自身、请求、视图函数、视图参数、视图参数):
path=request.path
#查找切换选项,URL处于动态位置。我使用DB表;你在评论中说你用康斯坦斯
如果:#取决于您存储此信息的方式
返回HttpResponseRedirect(“”)

您不必重新启动服务器来解析新的URL.py。重启Apache就足够了。对于动态更改,我将变量添加到数据库表中。也许你可以为每个请求做一个查询,看看使用哪一组URL。或者在您的中间件中添加一个db查找。我想关键是避免重新启动任何服务。当我说“重新启动服务器”时,我指的是Web服务器进程(例如apache、daphne或gunicorn或其他什么),而不是重新启动整个机器。但我觉得这不是必须的。关于如何存储切换的问题,我一直使用
Constance
来实现这一点,效果非常好。更多的是关于如何使用切换来动态启用或禁用应用程序中的URL您不必重新启动服务器来解析新的URL.py。重启Apache就足够了。对于动态更改,我将变量添加到数据库表中。也许你可以为每个请求做一个查询,看看使用哪一组URL。或者在您的中间件中添加一个db查找。我想关键是避免重新启动任何服务。当我说“重新启动服务器”时,我指的是Web服务器进程(例如apache、daphne或gunicorn或其他什么),而不是重新启动整个机器。但我觉得这不是必须的。关于如何存储切换的问题,我一直使用
Constance
来实现这一点,效果非常好。更多的是关于我如何使用切换来动态启用或禁用来自applicationy的URL,这正是我使用我尝试过的中间件所做的排序。但是,正如我在问题中提到的,这与Swagger不太好,所以我认为Swagger仍然会显示被切换的URL的文档。我不知道Swagger,所以无法在这方面帮助您。是的,这正是我使用中间件所做的尝试。但是,正如我在问题中提到的,这对Swagger来说不是很好,所以我认为Swagger仍然会显示被切换的URL的文档。我不知道Swagger,所以在这方面我帮不了你。