From f9c9dad0ce56055332d9fb4b33bcf32dbbf45d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Diemer?= Date: Wed, 16 Jan 2019 22:55:16 +0100 Subject: [PATCH] routers: add check on register Trying to register new routes on a router after having accessed the router `urls` attribute leads to surprising results. The route is added without error to the router's `registry` but the urls are not updated, because they are cached in `_urls`. This commit prevents registering new routes after `_urls` is created. --- rest_framework/routers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rest_framework/routers.py b/rest_framework/routers.py index de04cb674..3a4d7a1aa 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -86,6 +86,8 @@ class BaseRouter(six.with_metaclass(RenameRouterMethods)): self.registry = [] def register(self, prefix, viewset, basename=None, base_name=None): + assert not hasattr(self, '_urls'), ( + "You should register all your urls before accessing self.urls.") if base_name is not None: msg = "The `base_name` argument is pending deprecation in favor of `basename`." warnings.warn(msg, PendingDeprecationWarning, 2)