配置不当:包含的 urlconf <project>.urls 中没有任何模式

Posted

技术标签:

【中文标题】配置不当:包含的 urlconf <project>.urls 中没有任何模式【英文标题】:ImproperlyConfigured: The included urlconf <project>.urls doesn't have any patterns in it 【发布时间】:2014-01-24 16:14:33 【问题描述】:

我有一个 django (1.6.x) 项目在开发服务器上运行良好,但在 Ubuntu 12.04.3 上的 Apache2 (2.2.22.1) 和 mod_wsgi (3.3-4) 下失败并出现错误

配置不当:包含的 urlconf erp.urls 中没有任何模式

我不明白为什么它可以与开发服务器一起使用,但不能与 Apache2/mod_wsgi 一起使用,而且我发现很难追踪错误的来源。

还有许多其他类似的 SO 问题,但我使用反向的唯一地方(以前发现的一个问题)是在我的模型中的 get_absolute_url - 这应该没问题吗?

项目设置为la Two Scoops风格,具体布局如下:

&lt;repository_root&gt;/&lt;django_project_root&gt;/&lt;configuration_root&gt;/

翻译为:

erp_root/erp/erp/

设置是

erp_root/erp/erp/settings/*py(包括__init__.py

erp/urls.py;

from django.conf import settings
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^$', 'django.contrib.auth.views.login', 'template_name': 'login.html'),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^login/$', 'django.contrib.auth.views.login', 'template_name': 'login.html', name='login'),
    url(r'^logout/$', 'django.contrib.auth.views.logout_then_login', , name='logout'),
    url(r'^search/', include('haystack.urls')),
    url(r'^inventory/', include('inventory.urls')),
)

if settings.DEBUG:
    import debug_toolbar
    urlpatterns += patterns('',
    url(r'^__debug__/', include(debug_toolbar.urls)),
)

和inventory/urls.py:

from django.conf.urls import url, patterns
from .forms import CarrierWizardForm1, CarrierWizardForm2, MovementWizardForm1,MovementWizardForm2
from . import views

carrier_wizard_forms = [CarrierWizardForm1, CarrierWizardForm2]
movement_wizard_forms = [MovementWizardForm1, MovementWizardForm2]

urlpatterns = patterns('',
    url(r'^$', views.PartNumberListView.as_view(), name='inventory_list_index'),
    url(r'^parttype/$', views.part_type_list, name='index'),
    url(r'^parttype/(?P<parttype>\d2)/$', views.part_type_view, name='part_type_view'),
    url(r'^partnumber/$', views.PartNumberListView.as_view(), name='partnumber_list'),
    url(r'^partnumber/add/$', views.PartNumberCreateView.as_view(), name='partnumber_add'),
    url(r'^partnumber/(?P<slug>[-\w]+)/$', views.PartNumberView.as_view(), name='partnumber_view'),
    url(r'^partnumber/(?P<slug>[-\w]+)/update/$', views.PartNumberUpdateView.as_view(), name='partnumber_update'),
    url(r'^partnumber/(?P<slug>[-\w]+)/delete/$', views.PartNumberDeleteView.as_view(), name='partnumber_delete'),
    ....
       )

和 erp/settings/dev.py:

# Django settings for erp project.
# settings.py

from unipath import Path

PROJECT_DIR = Path(__file__).ancestor(3)
MEDIA_ROOT = PROJECT_DIR.child("media")
STATIC_ROOT = PROJECT_DIR.child("static")
STATICFILES_DIRS = (
  PROJECT_DIR.child("assets"),
)
TEMPLATE_DIRS = (
  PROJECT_DIR.child("templates"),
)


DEBUG = True
TEMPLATE_DEBUG = DEBUG

TIME_ZONE = 'Australia/Melbourne'
LANGUAGE_CODE = 'en-au'
SITE_ID = 1
USE_TZ = True

DATE_FORMAT = 'd/m/y'
SHORT_DATE_FORMAT = 'd/m/y'

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://example.com/media/", "http://media.example.com/"
MEDIA_URL = ''

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/var/www/example.com/static/"
STATIC_ROOT = ''

# URL prefix for static files.
# Example: "http://example.com/static/", "http://static.example.com/"
STATIC_URL = '/static/'

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

MIDDLEWARE_CLASSES = (
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'stronghold.middleware.LoginRequiredMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'erp.urls'

# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'erp.wsgi.application'


INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'django.contrib.formtools',
    'django.contrib.humanize',
    'inventory',
    'django_extensions',
    'extra_views',
    'debug_toolbar',
    'django_tables2',
    'stronghold',
    'bootstrap3',
    'haystack',
)

LOGIN_URL = '/login'
LOGOUT_URL = '/logout'

# For Stronghold
STRONGHOLD_PUBLIC_NAMED_URLS = (
    'login',
    'logout',
)

# This is required by the debug toolbar middleware
INTERNAL_IPS = ('192.168.0.16','0.0.0.0','127.0.0.1','::1', '192.168.0.115')

# This is reqquired by django_tables2
TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
                           "django.core.context_processors.debug",
                           "django.core.context_processors.i18n",
                           "django.core.context_processors.media",
                           "django.core.context_processors.static",
                           "django.core.context_processors.tz",
                           "django.contrib.messages.context_processors.messages",
                           "django.core.context_processors.request"
                          )


LOGIN_REDIRECT_URL = '/inventory/'

DEBUG_TOOLBAR_PANELS = [
'debug_toolbar.panels.versions.VersionsPanel',
'debug_toolbar.panels.timer.TimerPanel',
'debug_toolbar.panels.settings.SettingsPanel',
'debug_toolbar.panels.headers.HeadersPanel',
'debug_toolbar.panels.request.RequestPanel',
'debug_toolbar.panels.sql.SQLPanel',
'debug_toolbar.panels.staticfiles.StaticFilesPanel',
'debug_toolbar.panels.templates.TemplatesPanel',
'debug_toolbar.panels.cache.CachePanel',
'debug_toolbar.panels.signals.SignalsPanel',
'debug_toolbar.panels.logging.LoggingPanel',
]

def show_toolbar(request):
    return True  # Always show toolbar, for example purposes only.

DEBUG_TOOLBAR_CONFIG = 
'INTERCEPT_REDIRECTS': False,
'INSERT_BEFORE': '</body>',
'ENABLE_STACKTRACES': True,


# This is required for Haystack - the search engine
HAYSTACK_CONNECTIONS = 
      'default': 
    'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
    'URL': 'http://127.0.0.1:8085/solr/erp',
  ,

我的 wsgi 是标准的,带有次要设置的 mod:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "erp.settings.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

我的 apache2/sites-avail/erp.conf 是:

<VirtualHost *:80>
   ServerName deverp
   ServerAdmin administrator
   DocumentRoot /path/www/dev/erp/erp/
   ErrorLog /var/log/apache2/dev/error.log
   CustomLog /var/log/apache2/dev/access.log combined
   WSGIDaemonProcess deverp python-path=/path/www/dev/erp/erp:/path/.virtualenvs/erp-dev/lib/python2.7/site-packages
   WSGIProcessGroup deverp
   WSGIScriptAlias / /path/www/dev/erp/erp/erp/wsgi.py
  <Directory /path/www/dev/erp/erp/erp>
  <Files wsgi.py>
    Order deny,allow
    Allow from all
  </Files>
  </Directory>
</VirtualHost>

【问题讨论】:

在 erp/wsgi.py 中,尝试import sys; import erp.urls; print &gt;&gt; sys.stderr, erp.urls.__file__ 之类的内容,然后检查您的错误日志 添加你的 apache vhost.conf 升级 django-debug-toolbar 时出现此错误。尝试早期版本。 当我尝试从 app/forms.py 反转 url 时出现此错误,而它在我的 models.py 文件中工作并且似乎在其他任何地方工作。我在 /admin/ 得到了 ImproperlyConfigured 包含的 urlconf my_project.urls 中没有任何模式。我正在尝试使用 get_form 在我的管理视图中使用该表单,我认为这与它有关。 @radtek 您需要在 SO 上查看有关反向 url 的其他问题 - 这更有可能是您的问题。正如我在最初的问题中所指出的那样,那里有一个数字。 【参考方案1】:

还要确保您包含的文件中有 urlpatterns 并且拼写正确

【讨论】:

【参考方案2】:

我使用 reverse 而不是 reverse_lazy 来定义 RedirectView 的 url 参数。

class YourRedirectView(RedirectView):
    url = reverse('reversed_url')

由于 urls.py 尚未初始化,错误即将出现。只需使用:

class YourRedirectView(RedirectView):
    url = reverse_lazy('reversed_url')

【讨论】:

这是一个真正的 Django 'gotcha'。【参考方案3】:

所以,我实际上遇到了类似的问题。巧合的是,在您发布django-stronghold 的问题之后。该问题实际上是由于 django-debug-toolbar 中缺少设置。

您缺少的设置是:

DEBUG_TOOLBAR_PATCH_SETTINGS = False 

它可以与 runserver 一起使用,但是如果您尝试使用 honcho、gunicorn 或其他任何使用 WSGI 接口的东西来运行它,它就会崩溃。

希望这会有所帮助!

编辑:正如@japhyr 在下面提到的,查看明确的设置说明很有用:http://django-debug-toolbar.readthedocs.org/en/1.0/installation.html#explicit-setup

【讨论】:

很棒的发现 - 我永远不会尝试。谢谢,现在一切正常。 DEBUG_TOOLBAR_​​PATCH_SETTINGS = False 也为我工作。谢谢! 这解决了我的问题。太感谢了。就像@datakid 说的那样,我永远不会尝试这个。 嘿@datakid,如果这对你有用,你能接受这个答案吗? 这是我的核心问题,但这里的建议还不够。我还必须遵循 django-debug-toolbar 的其余 Explicit setup 说明。【参考方案4】:

我遇到了一个非常相似的问题。我的项目在测试服务器上运行良好,但是当我尝试部署到 gunicorn 时,我得到了同样的 ImproperlyConfigured 错误。

如果我注释掉包含另一个 url 文件的 url(即url(r'^admin/', include(admin.site.urls)),,那么我的其余 url 工作正常。

[更新] 我能够将其进一步缩小到仅包含一个我包含的 url 文件,但找不到任何特别之处。但是,在我的 settings.py 文件中设置 Debug=False 似乎对我来说已经修复了。

【讨论】:

你在使用 django-debug-toolbar 吗? 我是,但在阅读了 mgrouchy 的评论后,我禁用了它,即使使用 Debug=True 也能正常工作。 如果您仍想使用工具栏,可以尝试按照explicit instructions 设置工具栏,如果您还没有这样做的话。我前段时间安装了工具栏,使用 runserver 进行了大量开发工作,但在我为生产服务器配置时已经忘记了工具栏的潜在问题。【参考方案5】:

从 django 1.5 升级到 1.6 后,我遇到了类似的问题。我不确定我的经历是否和你一样。

首先,您可以向上滚动错误,并检查admin.autodiscover() 是什么产生了问题?或者注释掉这一行,看看页面是否会加载。

我发现的问题与wsgi.py 有关。您可以发布此文件吗?

【讨论】:

尝试注释掉 admin.autodiscover() 但它没有解决任何问题...为建议喝彩。 我仍然建议您查看 wsgi.py - 如果它在开发服务器上有效但在 apache/mod wsgi 上无效,则暗示问题与该接口有关。

以上是关于配置不当:包含的 urlconf <project>.urls 中没有任何模式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rider 中为项目设置默认运行配置

路由配置系统(URLconf)

django 配置URLconf和获取值

Django -- URLconf 配置技巧

Django:配置不当:SECRET_KEY 设置不能为空

访问另一个项目的设置文件