Django URL-Patterns:如何检查所有url-names是否都是不同的?

时间:2016-04-06 09:11:54

标签: django testing

我想检查我的django项目中url模式的所有名称是否都是不同的。

我不想两次意外使用一个名字。

4 个答案:

答案 0 :(得分:5)

安装django-extensions并运行此命令:

python manage.py show_urls

它会显示您应用中的所有网址

计算名称出现次数:

python manage.py show_urls -f verbose|grep 'URL Name' | sort | uniq -c 

https://github.com/django-extensions/django-extensions

答案 1 :(得分:1)

def test_url_name_not_duplicate(self):
    resolver = urlresolvers.get_resolver(None)
    names=defaultdict(list)
    for pattern in resolveutils.walk_url_patterns(resolver.url_patterns):
        if not pattern.name:
            continue
        names[pattern.name].append(pattern)
    duplicates=dict([(name, patterns) for name, patterns in names.items() if len(patterns)>1])
    self.assertFalse(duplicates, 'url patterns with duplicate names exist:\n%s' % '\n'.join(['url_name "%s":\n%s\n' % (
        name, '\n'.join(['    %s %s %s' % (pattern.regex.pattern, pattern.callback, inspect.getsourcefile(pattern.callback)) for pattern in patterns])) for name, patterns in sorted(duplicates.items())]))

辅助方法walk_url_patterns()

def walk_url_patterns(patterns):
    for pattern in patterns:
      if hasattr(pattern, 'url_patterns'):
          for pattern in  walk_url_patterns(pattern.url_patterns):
              yield pattern
      else:
          yield pattern

如果存在重复项,则输出:

url_name "myquery":
    ^myquery/$ <function myquery> /home/user/src/foo/foo/views/query.py
    ^query/$ <function myquery> /home/user/src/foo/foo/views/query.py

url_name "bla":
    ^bla/$ <function bla> /home/user/src/foo/foo/views/bla.py
    ^bla2/$ <function bla2> /home/user/src/foo/foo/views/bla2.py

答案 2 :(得分:0)

只需确保目录/ project_name / project_name /中的urls.py表示如下:

  

url(r'^ polls /',include('polls.urls',namespace =“polls”))。

然后,您的所有应用程序都将使用不同的URL。在您的应用程序中:确保您的网址是这样的:

  

url(r'^ download / $',views.download,name ='download'),
  url(r'^ anotherurl / $',views.download,name ='download'),

所以所有的网址都会有所不同。事实上,我不喜欢将参数放入网址的方式,比如

  

/ polls / question / 3 / result /

这样可以更轻松地两次使用网址名称。我会改变它

  

/ possl /问题/结果/?question_id = 3

答案 3 :(得分:0)

如果您将项目很好地构建到小型的django-apps中,那么这样的测试应该是,这样每个应用程序的路由都可以轻松监控。

查看James Bennett关于DjangoCon 2008的this great slides有关何时介绍新应用以及如何构建项目的一些想法。