【问题标题】:Why are the Django project URLs not all available to the Django test client?为什么 Django 项目 URL 并非对 Django 测试客户端都可用?
【发布时间】:2011-04-01 18:05:52
【问题描述】:

我一直在尝试将 django-lean 应用程序添加到我的项目中。 django-lean 应用程序不在我正在处理的项目中,它在 PYTHONPATH 上。

我无法通过 django-lean 测试。

似乎问题在于 TestCase 为 urls 定义了一个值:

 urls = 'django_lean.experiments.tests.urls'

据我所知,测试仅获取位于 @'django_lean.experiments.tests.urls' 的 url,而不是 来自项目其余部分的网址。

这会导致如下错误消息:

NoReverseMatch: Reverse for 'index' with arguments '()' and keyword arguments '{}' not found.

这些是由项目中的 {% url %} 模板标签触发的。

如何确保项目的所有 url 都可用于测试?

编辑: 有人向我展示了一个打印可见 URL 的脚本:

import urls

def show_urls(urllist, depth=0):
  for entry in urllist:
    print "  " * depth, entry.regex.pattern
    if hasattr(entry, 'url_patterns'):
        show_urls(entry.url_patterns, depth + 1)

我从 ipdb 调用了这个脚本,输出如下:

   ipdb> import urls
   ipdb> show_urls(urls.urlpatterns)
    ^test-experiment/(?P<experiment_name>.*)$
    ^test-clientsideexperiment/(?P<experiment_name>.*)$
    ^admin/
      ^(?P<experiment_name>.+)/$
      ^$
    ^main-app/
      ^goal/(?P<goal_name>.*)$
      ^confirm_human/$

这对应于位于@'django_lean.experiments.tests.urls'的url

urlpatterns = patterns('django_lean.experiments.tests.views',
  url(r'^test-experiment/(?P<experiment_name>.*)$', 'experiment_test'),
  url(r'^test-clientsideexperiment/(?P<experiment_name>.*)$', 'clientsideexperiment_test'))

urlpatterns += patterns('',
   url(r'^admin/', include('django_lean.experiments.admin_urls')),
   url(r'^main-app/', include('django_lean.experiments.urls')),

我遇到的问题是我的测试都失败了,因为来自项目中其他应用程序的命名 url 被 URL 模板标签调用,测试无法访问。

我正在运行 Python 2.7 和 Django 1.2.1

【问题讨论】:

  • 好吧,如果你去掉url的显式限制,django默认使用项目url。
  • 我尝试注释掉:# urls = 'django_lean.experiments.tests.urls' 我仍然遇到同样的错误。

标签: django django-urls django-testing


【解决方案1】:

解决方案非常简单。只需将主项目中的 URL 导入应用程序的 urls.py 即可。

from forum.urls import urlpatterns

或更通用的解决方案:

from settings import ROOT_URLCONF as project_urls
urlpatterns = __import__('forum.urls').urls.urlpatterns

【讨论】:

    【解决方案2】:

    要列出您的 django 知道的所有 url 模式,您可以使用 answer suggested here。 从您的测试中运行它并打印/记录输出。

    请注意,最好明确说明从哪里导入网址

     from myproject import urls
    

    因为您可能还有其他一些包含 urls 文件的模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 2016-06-10
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      相关资源
      最近更新 更多