在 Django 中加载所有 url 时发出信号
Signal when all urls are loaded in Django
我想对 django 的所有 url 模式施展魔法:
如果他们没有名字,那么我想给他们一个自动命名。
不幸的是,django 似乎懒惰地加载了 url 模式。
实现这个魔法添加名称方法很简单,不属于这个问题。
问题:在哪里调用这个方法?我需要在加载所有 url 之后和处理第一个请求之前调用此方法。
代码应该适用于 Django 1.9 和 Django 1.10。
背景
Django 不推荐使用像这样的导入字符串 (Deprecate the ability to reverse by dotted path)
reverse('myapp.views.my_view')
我有一个庞大的遗留代码库,我不喜欢输入和维护冗余字符。
我希望所有没有名称的 url 都具有相应导入字符串的名称。
urls.py中的示例:
url(r'^.../.../(?P<pk>[^/]+)/$', views.my_view))
我想将此 url 的名称自动设置为 'myapp.views.my_view'。
事后我不会使用信号来更改创建的 url,而是为 django.conf.urls.url
:
写一个替换包装器
def url(*args, **kwargs):
if 'name' not in kwargs:
kwargs['name'] = modulename(args[1]) # Returns something like 'polls.indexview'
return django.conf.urls.url(*args, **kwargs)
你可以像这样使用
# from django.conf.urls import url # Removed to enable auto-naming
from autonameroutes.urls import url
from . import views
app_name = 'polls'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
...
]
逻辑应该与更改系统中的所有路由时的逻辑基本相同,但是当您想要使用它时您将拥有更多控制权,并且更改对于以后维护代码的开发人员来说会更加明显。
我想对 django 的所有 url 模式施展魔法:
如果他们没有名字,那么我想给他们一个自动命名。
不幸的是,django 似乎懒惰地加载了 url 模式。
实现这个魔法添加名称方法很简单,不属于这个问题。
问题:在哪里调用这个方法?我需要在加载所有 url 之后和处理第一个请求之前调用此方法。
代码应该适用于 Django 1.9 和 Django 1.10。
背景
Django 不推荐使用像这样的导入字符串 (Deprecate the ability to reverse by dotted path)
reverse('myapp.views.my_view')
我有一个庞大的遗留代码库,我不喜欢输入和维护冗余字符。
我希望所有没有名称的 url 都具有相应导入字符串的名称。
urls.py中的示例:
url(r'^.../.../(?P<pk>[^/]+)/$', views.my_view))
我想将此 url 的名称自动设置为 'myapp.views.my_view'。
事后我不会使用信号来更改创建的 url,而是为 django.conf.urls.url
:
def url(*args, **kwargs):
if 'name' not in kwargs:
kwargs['name'] = modulename(args[1]) # Returns something like 'polls.indexview'
return django.conf.urls.url(*args, **kwargs)
你可以像这样使用
# from django.conf.urls import url # Removed to enable auto-naming
from autonameroutes.urls import url
from . import views
app_name = 'polls'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
...
]
逻辑应该与更改系统中的所有路由时的逻辑基本相同,但是当您想要使用它时您将拥有更多控制权,并且更改对于以后维护代码的开发人员来说会更加明显。