我正在做一个项目,在这个项目中,我们使用功能切换来隐藏功能,直到它们准备好被发布。
我们遵循的模式是,如果功能切换开关关闭,就不对某些端点进行路由。例如在 urls.py
中的URL,我们只包括 urlconf
如果切换是开启的。但这意味着只有当服务器重新启动时,功能切换才会有效果。我们希望能够在运行中的服务器上动态地打开和关闭功能切换。似乎 urlconf
只有在启动时才会被解析,所以在没有重启的情况下,对它的更改不会被反映出来。
我试着做了一个中间件,根据功能切换的值来阻止某些URL,这可以工作,但不能很好的与 Swagger
docs,我也希望能反映出功能切换的状态。
总的来说,感觉我是在和系统作斗争,这通常是我处理问题的角度不对。
那么,大家建议我如何在Django中实现动态功能切换的行为呢?
EDIT:我的意思是说,我看了一些帖子,比如这个。Django动态urlpatterns 但其实并没有任何解决方法。
有些甚至是老帖子说要强行刷新的。urlconf
我试过这样做,但是,虽然我可以看到代码再次被执行,但这似乎并不影响URLs。好像它们被缓存了,但我找不到任何方法来清除缓存(我找到的所有关于这个问题的帖子都已经过时了)。
在urls.py中包含所有的urls。然后将if-else重定向添加到中间件中。
我不清楚是有很多toggleurl选项还是只有一个,但听起来你已经有办法存储和查找这些信息了。
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>")