2012-04-12 8 views
1

Ich habe eine Django App, die auf einem Produktionsserver läuft. Es wird mit Gunicorn 0.14.2 hinter Nginx behandelt. Wenn ich die app (durch Neuladen des gunicorn Arbeiters) neu zu laden, bekomme ich diesen Fehler:Warum gibt Django beim Laden meiner URLconf eine Warnung aus?

Traceback (most recent call last): 

File "/opt/nybooks/venv/myapp/lib/python2.6/site-packages/django/core/handlers/base.py", line 101, in get_response 
    request.path_info) 

File "/opt/nybooks/venv/myapp/lib/python2.6/site-packages/django/core/urlresolvers.py", line 250, in resolve 
    for pattern in self.url_patterns: 

File "/opt/nybooks/venv/myapp/lib/python2.6/site-packages/django/core/urlresolvers.py", line 283, in _get_url_patterns 
    raise ImproperlyConfigured("The included urlconf %s doesn't have any patterns in it" % self.urlconf_name) 

ImproperlyConfigured: The included urlconf myapp.urls doesn't have any patterns in it 

Andere mit diesem Problem häufig haben festgestellt, dass es während reverse in einem URLconf Verwendung auftritt, aber ich bin nicht mit reverse in jedem URLconfs (noch werden sie in Apps von Drittanbietern verwendet). Dieser Fehler nur tritt in der Produktion auf - nie in der Entwicklung (mit dem Django-Dev-Server) oder auf meinem Staging-Server (mit Gunicorn 0.14.2 hinter Nginx). Es scheint auch keine Probleme mit der Website zu anderen Zeiten als beim Nachladen zu verursachen.

Irgendwelche Ideen, was das Problem verursacht?


Hier ist das Haupt URLconf (und der in dem Stack-Trace bezogen):

from django.conf.urls.defaults import * 
from django.contrib import admin 
from django.conf import settings 
from django.http import HttpResponse, Http404 
from django.views.generic.simple import direct_to_template, redirect_to 

from myapp.apps.magazine.views import * 
from myapp.apps.books.views import * 
from myapp.apps.forms.views import * 
from myapp.apps.blogext.views import * 
from myapp.apps.sharing.views import expand_url, email_link_send 
from myapp.apps.magazine.feeds import * 

from satchmo_utils import urlhelper 

from satchmo_store.urls import urlpatterns 
from myapp.apps.myapp_shop.views import * 

admin.autodiscover() 

if settings.SHOP_BASE == '': 
    shopregex = '^' 
else: 
    shopregex = '^' + settings.SHOP_BASE[1:] + '/' 


myapp_patterns = patterns('', 
    # calendar 
    (r'^calendar/',   include('events.urls')), 
    # for multimedia SWF access 
    #(r'^crossdomain.xml$', direct_to_template, {'template': 'crossdomain.xml'}), 
    # intercept checkout 
    # TODO: need to use a config value 
    (r'^catalog/checkout/$', 'myapp.apps.cart.views.myapp_checkout', {'SSL': not settings.LOCAL_DEV}, 'myapp_checkout'), 
    (r'^catalog/add/$', 'myapp.apps.cart.views.smart_add_wrapper', {}, 'myapp_smart_add'), 
    # URLs for NYRB apps 
    (r'^$',       direct_to_template, {'template': 'newhomepage.html'}), 
    (r'^newhomepage/$',    direct_to_template, {'template': 'newhomepage.html'}), 
    (r'^mobile/$',     redirect_to, {'url': '/', 'permanent': True}), 
    (r'^books/authors/',   include('myapp.apps.books.urls.authors')), 
    (r'^books/',     include('myapp.apps.books.urls.books')), 
    (r'^articles/',     include('myapp.apps.magazine.urls.articles')), 
    (
    r'^mobile/articles/archives/(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$', 
    redirect_to, 
    {'url': '/articles/archives/%(year)s/%(month)s/%(day)s/%(slug)s/', 'permanent': True}, 
), 
    # for national poetry month (april) 
    url(
    regex = r'^national-poetry-month/', 
    view = poetry_month, 
    name = 'poetry_month', 
), 
    (r'^issues/',     include('myapp.apps.magazine.urls.issues')), 
    (r'^contributors/',    include('myapp.apps.magazine.urls.contributors')), 
    (r'^galleries/',    include('myapp.apps.magazine.urls.illustrations')), 
    (r'^multimedia/',    include('myapp.apps.multimedia.urls.multimedia')), 
    (r'^online/$',     direct_to_template, {'template': 'online.html'}), 

    #(r'^search/',     include('myapp.apps.search.urls')), 
    (r'^search/', include('solango.urls')), 
    (r'^textareas/', include('myapp.apps.textareas.urls')), 

    (r'',       include('myapp.apps.forms.urls')), 
    (r'^utils/',     include('myapp.apps.utils.urls')), 
    #(r'^rss/$',      'myapp.apps.magazine.views.rss_list'), 
    (r'^rss/huffpo/$',    redirect_to, {'url': '/articles/feeds/huffpo/', 'permanent': False}), 
    (r'^rss/googlenews/$',   redirect_to, {'url': '/articles/feeds/googlenews/', 'permanent': False}), 
    (r'^newsletter/',    include('myapp.apps.newsletter.urls')), 
    (r'^subscriptions/',   include('myapp.apps.newsubscriptions.urls')), 
    (r'^shared/',     include('myapp.apps.sharing.urls')), 
    (r'^counter/',     include('myapp.apps.counter.urls')), 

    # Redirects for legacy NYRB system 
    (r'^nyrev/(\w+)',       uber_legacy_article_redirect), 
    (r'^nyrev/',        redirect_to, {'url': '/'}), 
    (r'contents/(?P<legacy_date>\d+)/',  legacy_issue_detail_redirect), 
    (r'^archives/browse/?$',     legacy_browse_archives), 
    (r'^gallery/gallery-browse/?$',   legacy_gallery_browse), 
    (r'^gallery/',       legacy_illustration), 
    (r'authors/(?P<legacy_author_id>\d+)/', legacy_author_detail_redirect), 
    #(r'shop/product',       legacy_book_detail_redirect), 
    (r'^shop/product/?$',      legacy_product), 
    (r'^myapp/browse/?$',      legacy_book_browse), 

    (r'blogs/myapplog/post/(\d+)/(?P<slug>[-\w]+)/$', solango_blogsearch_redirect), 

    # URL shortening 
    (r'^u/(?P<short_url>[a-zA-Z0-9]+)/$', expand_url), 

    # NYRB shop 
    (r'^shop/',      include('myapp.apps.myapp_shop.urls')), 
    (r'^admin/shop/order/csv/?', csv_order_export_day), 
    (r'^admin/shop/order/(?P<order_id>\d+)/csv/?', csv_order_export), 

    # URLs for Savoy apps 
    (r'^tags/',      include('savoy.contrib.sections.tag_urls')), 
    (r'^podcasts/',     include('savoy.contrib.podcasts.urls')), 
    (r'^blogs/$',     redirect_to, {'url': "/blogs/myapplog/", 'permanent': False}), 
    (r'^blogs/',     include('savoy.contrib.blogs.urls')), 
    (r'^media/',     include('savoy.core.media.urls')), 

    # this is to use our own edit profile view 
    (r'^users/(?P<username>.+)/edit/$', edit_profile), 
    (r'^users/',     include('savoy.core.profiles.urls')), 

    # django-authopenid 
    (r'^account/getusername/',  get_lost_username), 

    #(r'account/signin/?',   'myapp.apps.forms.views.dual_login'), 
    (r'account/signin/?',   'django.contrib.auth.views.login', {'template_name': 'authopenid/signin.html'}), 
    (r'account/signout/?',   'django.contrib.auth.views.logout', {'next_page': '/'}), 
    (r'account/sendpw/?',   'myapp.apps.forms.views.dual_sendpw'), 
    (r'account/resetpw/?',   'myapp.apps.forms.views.reset_pw'), 
    (r'account/signup/?',   'myapp.apps.forms.views.link_and_signup'), 

    #(r'^account/',     include('django_authopenid.urls')), 

    # django-mailfriend 
    (r'^mail_friend/send/?',  email_link_send), 
    (r'^mail_friend/',    include('mailfriend.urls')), 

    # django.contrib.comments 

    # Django admin (Satchmo additions): 
    (r'^admin/print/(?P<doc>[-\w]+)/(?P<id>\d+)',      'shipping.views.displayDoc'), 
    (r'^admin/product/configurableproduct/(?P<id>\d+)/getoptions/', 'product.views.get_configurable_product_options'), 

    # Orders 
    (r'^admin/open-orders/$', 'myapp.apps.myapp_shop.views.open_orders'), 

    # Institutional subscription CSV 
    (r'^admin/subscriptions/institutionalsubscription\.csv', 'myapp.apps.subscriptions.views.institutional_sub_csv'), 

    # COUNTER admin for institutional reports 
    #(r'^admin/institution-counts/multiple-report/csv/$',   'myapp.apps.subscriptions.views.institution_multiple_csv'), 
    #(r'^admin/institution-counts/multiple-report/$',    'myapp.apps.subscriptions.views.institution_multiple_report'), 
    (r'^admin/institution-counts/institutions/(?P<id>\d+)/csv/', redirect_to, {'url': '/counter/%(id)s.csv'}), 
    (r'^admin/institution-counts/institutions/(?P<id>\d+)/$',  redirect_to, {'url': '/counter/%(id)s/'}), 
    #(r'^admin/institution-counts/process_file/?$',     'myapp.apps.subscriptions.views.institution_process_file'), 
    (r'^admin/institution-counts/$',        redirect_to, {'url': '/counter/'}), 

    # Django admin (standard) 
    (r'^admin/doc/',    include('django.contrib.admindocs.urls')), 
    (r'^admin/',     include(admin.site.urls)), 

    # custom feeds 
    (r'^feed/author/(?P<slug>[-\w]+)/$', AuthorFeed()), 
) 

# attach satchmo patterns after our patterns so we can override if needed 
from satchmo_store.urls import urlpatterns 
urlpatterns = myapp_patterns + urlpatterns 

if settings.DEBUG: 
    urlpatterns += patterns('django.views.static', 
     (r'media/(?P<path>.*)', 'serve', {'document_root': settings.MEDIA_ROOT}), 
    ) 
+0

Zeigen Sie uns eine bereinigte Version Ihrer urlconf. – agf

+0

Haben Sie verschiedene local_settings.py-Dateien für die Staging- und Produktionsserver? Was sind die Unterschiede zwischen den beiden? Ich dachte, Reverse könnte auch in Ansichten aufgerufen werden. Wenn dies der Fall ist, könnte ein Ansatz mit "teile und herrsche" in Bezug auf die Importimporte das Problem finden. Wenn Sie verschiedene virtuelle envs verwenden, die in jedem env einen pip-freeze-Vorgang ausführen, können Sie einige Unterschiede in der Bibliothek feststellen. – mtnpaul

+0

haben Sie versucht, in irgendeiner Weise diese URL-Konfiguration zu debuggen? Vielleicht kannst du ein paar Prints darin einfügen (in verschiedenen Zeilen ... etwas wie: 'print myapp_patterns' und' printurlpatterns) Öffne danach eine Python-Shell und führe aus: 'from the_app_you_want Importiere URL's und du wirst sehen, was läuft mit deinen URL-Mustern – marianobianchi

Antwort

2

Meine Vermutung ist, es mit Ihrem satchmo Muster zu tun hat und auf dem Namen „urlpatterns“ Überlastung, die django sucht gezielt.

Versuchen

from satchmo_store.urls import urlpatterns as satchmo_patterns 
urlpatterns = myapp_patterns + satchmo_patterns 

#etc. 
+0

Gute Idee, aber das hat das Problem nicht behoben. – mipadi

+2

Ihr Code-Snippet oben hat 'von satchmo_store.urls Import URLPatterns' an zwei Stellen. Hast du den ersten Kommentar gemacht und dann den zweiten mit 'from satchmo_store.urls import urlpatterns als satchmo_patterns' ersetzt? Sogar die Satchmo-Dokumentation schlägt vor, "von satchmo_store.shop.urls importieren Sie URL-Muster als Shopmuster". – dgel

+0

@dgel: Hab das mal versucht, aber immer noch nicht gehen. – mipadi

0

Das seltsame Verhalten vor if settings.DEBUG sein bacause kann, urlpatterns aus irgendeinem Grund ist leer.

Beim Ausführen des Dev-Servers wird dieser mit den URL-Mustern aus der statischen App ausgefüllt. Wenn es in der Produktion läuft, bleibt es leer.

Sie dies mit einer Klausel leicht wie

überprüfen
if urlpatterns: 
    # something is in urlpatterns 
    # What's its type, contents, ...? 
else: 
    # urlpatterns is empty 

Sobald Sie dies herausgefunden, können Sie tiefer graben. Sie können die Überprüfung auch in einem Komponententest hinzufügen oder direkt in der Python-Shell ausführen, indem Sie das URL-Modul importieren, wenn Sie es robuster machen möchten.

0

Ich denke, und das ist nur eine Ahnung, Ihre URLs vielleicht gut, (da keine Probleme in Ihrer gestuften dev-Maschine entstehen, nur auf prod nachladen) das Problem vielleicht mit der Art und Weise Gunicorn lädt die Module, und die So verhält sich Python-kompilierter Code zwischen verschiedenen Versionen des Interpreters und wie Iteratoren sich verhalten, aber auch dies sind alles Vermutungen.

Ich empfehle, dass Sie die gleiche Version von Python verwenden, die Sie auf der Produktion in Ihrer gestaffelten Maschine haben und sehen, wenn Sie den Fehler neu erstellen können, wenn es bereits die gleiche Version, dann muss es etwas anderes sein, der Grund, warum ich frage ist Die meisten Produktionsmaschinen neigen dazu, ältere Versionen von Python zu verwenden, obwohl ich falsch liegen könnte.

viel Glück.

0

Statt die urlpatterns = myapp_patterns + urlpatterns Sachen, sicher könnten wir stattdessen myapp_patterns nennen urlpatterns von der Fledermaus, und haben im Innern des Endes, etwas entlang der Linien von:

(r'^', include('satchmo_store.urls')), 

Da dies der „Django“ Weg ist, URL-Muster hinzufügen?

Dies könnte Ihr Problem lösen, ich bin mir nicht sicher. Einen Versuch wert, schätze ich.

+0

Leider hat Satchmo eine etwas komplizierte Art, URL-Muster zu erstellen, so dass die übliche Methode nicht funktioniert. – mipadi

Verwandte Themen