2015-11-12 62 views
0

Python/Django的新手。試圖製作問卷應用程序。「ImportError:無法導入名稱commit_on_success」和「發生服務器錯誤,請與管理員聯繫。」當運行Django服務器時

每當我運行$ python manage.py runserver本地服務器頁面會給我「服務器發生錯誤,請聯繫管理員。」

當我檢查終端時,顯示錯誤爲ImportError: cannot import name commit_on_success

回溯,如果你有興趣:

Traceback (most recent call last): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/handlers.py", line 85, in run 
    self.result = application(self.environ, self.start_response) 
    File "/Library/Python/2.7/site-packages/django/contrib/staticfiles/handlers.py", line 63, in __call__ 
    return self.application(environ, start_response) 
    File "/Library/Python/2.7/site-packages/django/core/handlers/wsgi.py", line 170, in __call__ 
    self.load_middleware() 
    File "/Library/Python/2.7/site-packages/django/core/handlers/base.py", line 52, in load_middleware 
    mw_instance = mw_class() 
    File "/Library/Python/2.7/site-packages/django/middleware/locale.py", line 24, in __init__ 
    for url_pattern in get_resolver(None).url_patterns: 
    File "/Library/Python/2.7/site-packages/django/core/urlresolvers.py", line 401, in url_patterns 
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) 
    File "/Library/Python/2.7/site-packages/django/core/urlresolvers.py", line 395, in urlconf_module 
    self._urlconf_module = import_module(self.urlconf_name) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/Users/geraldkwok/site/mysite/mysite/urls.py", line 10, in <module> 
    url(r'q/', include('questionnaire.urls')), 
    File "/Library/Python/2.7/site-packages/django/conf/urls/__init__.py", line 33, in include 
    urlconf_module = import_module(urlconf_module) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/Users/geraldkwok/site/mysite/questionnaire/urls.py", line 4, in <module> 
    from views import * 
    File "/Users/geraldkwok/site/mysite/questionnaire/views.py", line 25, in <module> 
    from compat import commit_on_success, commit, rollback 

我在做什麼錯?

我的settings.py:

import os.path 

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 

SITE_ID = 1 

SECRET_KEY = '^(4y84ten#x78w1u4rm6tv70zb9c-oonmvm#@[email protected]#d2k' 

DEBUG = True 

ALLOWED_HOSTS = [] 

LANGUAGES = (
    ('en', 'English'), 
    ('de', 'Deutsch') 
) 

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.sites', 
    'transmeta', 
    'questionnaire', 
    'questionnaire.page', 
) 

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'questionnaire.request_cache.RequestCacheMiddleware', 
) 

ROOT_URLCONF = 'mysite.urls' 

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [ 
      os.path.abspath('./apps/ed-questionnaire/questionnaire/templates'), 
      os.path.abspath('./templates'), 
     ], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

WSGI_APPLICATION = 'mysite.wsgi.application' 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
} 

LANGUAGE_CODE = 'en-us' 

TIME_ZONE = 'UTC' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 

STATICFILES_DIRS = (
os.path.abspath('./apps/ed-questionnaire/questionnaire/static/'), 
) 

STATIC_URL = '/static/' 
` 

我views.py:

`#!/usr/bin/python 
# vim: set fileencoding=utf-8 
from django.http import HttpResponse, HttpResponseRedirect 
from django.template import RequestContext 
from django.core.urlresolvers import reverse 
from django.core.cache import cache 
from django.contrib.auth.decorators import permission_required 
from django.shortcuts import render_to_response, get_object_or_404 
from django.db import transaction 
from django.conf import settings 
from datetime import datetime 
from django.utils import translation 
from django.utils.translation import ugettext_lazy as _ 
from questionnaire import QuestionProcessors 
from questionnaire import questionnaire_start, questionset_start, questionset_done, questionnaire_done 
from questionnaire import AnswerException 
from questionnaire import Processors 
from questionnaire.models import * 
from questionnaire.parsers import * 
from questionnaire.emails import _send_email, send_emails 
from questionnaire.utils import numal_sort, split_numal 
from questionnaire.request_cache import request_cache 
from questionnaire.dependency_checker import dep_check 
from questionnaire import profiler 
from compat import commit_on_success, commit, rollback 
import logging 
import random 
from hashlib import md5 
import re 
... 

@commit_on_success 
def questionnaire(request, runcode=None, qs=None): 
    """ 
    Process submit answers (if present) and redirect to next page 

    If this is a POST request, parse the submitted data in order to store 
    all the submitted answers. Then return to the next questionset or 
    return a completed response. 

    If this isn't a POST request, redirect to the main page. 

    We only commit on success, to maintain consistency. We also specifically 
    rollback if there were errors processing the answers for this questionset. 
    """ 
    if use_session: 
     session_runcode = request.session.get('runcode', None) 
     if session_runcode is not None: 
      runcode = session_runcode 

     session_qs = request.session.get('qs', None) 
     if session_qs is not None: 
      qs = session_qs 

    # if runcode provided as query string, redirect to the proper page 
    if not runcode: 
     runcode = request.GET.get('runcode') 
     if not runcode: 
      return HttpResponseRedirect("/") 
     else: 
      if not use_session: 
       args = [runcode, ] 
      else: 
       request.session['runcode'] = runcode 
       args = [] 
      return HttpResponseRedirect(reverse("questionnaire", args=args)) 

    runinfo = get_runinfo(runcode) 

    if not runinfo: 
     commit() 
     return HttpResponseRedirect('/') 

    # let the runinfo have a piggy back ride on the request 
    # so we can easily use the runinfo in places like the question processor 
    # without passing it around 
    request.runinfo = runinfo 

    if not qs: 
     # Only change the language to the subjects choice for the initial 
     # questionnaire page (may be a direct link from an email) 
     if hasattr(request, 'session'): 
      request.session['django_language'] = runinfo.subject.language 
      translation.activate(runinfo.subject.language) 

    if 'lang' in request.GET: 
     return set_language(request, runinfo, request.path) 

    # -------------------------------- 
    # --- Handle non-POST requests --- 
    # -------------------------------- 

    if request.method != "POST": 
     if qs is not None: 
      qs = get_object_or_404(QuestionSet, sortid=qs, questionnaire=runinfo.questionset.questionnaire) 
      if runinfo.random.startswith('test:'): 
       pass # ok for testing 
      elif qs.sortid > runinfo.questionset.sortid: 
       # you may jump back, but not forwards 
       return redirect_to_qs(runinfo, request) 
      runinfo.questionset = qs 
      runinfo.save() 
      commit() 
     # no questionset id in URL, so redirect to the correct URL 
     if qs is None: 
      return redirect_to_qs(runinfo, request) 
     questionset_start.send(sender=None, runinfo=runinfo, questionset=qs) 
     return show_questionnaire(request, runinfo) 

    # ------------------------------------- 
    # --- Process POST with QuestionSet --- 
    # ------------------------------------- 

    # if the submitted page is different to what runinfo says, update runinfo 
    # XXX - do we really want this? 
    qs = request.POST.get('questionset_id', qs) 
    try: 
     qsobj = QuestionSet.objects.filter(pk=qs)[0] 
     if qsobj.questionnaire == runinfo.questionset.questionnaire: 
      if runinfo.questionset != qsobj: 
       runinfo.questionset = qsobj 
       runinfo.save() 
    except: 
     pass 

    questionnaire = runinfo.questionset.questionnaire 
    questionset = runinfo.questionset 

    # to confirm that we have the correct answers 
    expected = questionset.questions() 

    items = request.POST.items() 
    extra = {} # question_object => { "ANSWER" : "123", ... } 

    # this will ensure that each question will be processed, even if we did not receive 
    # any fields for it. Also works to ensure the user doesn't add extra fields in 
    for x in expected: 
     items.append((u'question_%s_Trigger953' % x.number, None)) 

    # generate the answer_dict for each question, and place in extra 
    for item in items: 
     key, value = item[0], item[1] 
     if key.startswith('question_'): 
      answer = key.split("_", 2) 
      question = get_question(answer[1], questionnaire) 
      if not question: 
       logging.warn("Unknown question when processing: %s" % answer[1]) 
       continue 
      extra[question] = ans = extra.get(question, {}) 
      if (len(answer) == 2): 
       ans['ANSWER'] = value 
      elif (len(answer) == 3): 
       ans[answer[2]] = value 
      else: 
       logging.warn("Poorly formed form element name: %r" % answer) 
       continue 
      extra[question] = ans 

    errors = {} 
    for question, ans in extra.items(): 
     if not question_satisfies_checks(question, runinfo): 
      continue 
     if u"Trigger953" not in ans: 
      logging.warn("User attempted to insert extra question (or it's a bug)") 
      continue 
     try: 
      cd = question.getcheckdict() 
      # requiredif is the new way 
      depon = cd.get('requiredif', None) or cd.get('dependent', None) 
      if depon: 
       depparser = BooleanParser(dep_check, runinfo, extra) 
       if not depparser.parse(depon): 
        # if check is not the same as answer, then we don't care 
        # about this question plus we should delete it from the DB 
        delete_answer(question, runinfo.subject, runinfo.runid) 
        if cd.get('store', False): 
         runinfo.set_cookie(question.number, None) 
        continue 
      add_answer(runinfo, question, ans) 
      if cd.get('store', False): 
       runinfo.set_cookie(question.number, ans['ANSWER']) 
     except AnswerException, e: 
      errors[question.number] = e 
     except Exception: 
      logging.exception("Unexpected Exception") 
      rollback() 
      raise 

    if len(errors) > 0: 
     res = show_questionnaire(request, runinfo, errors=errors) 
     rollback() 
     return res 

    questionset_done.send(sender=None, runinfo=runinfo, questionset=questionset) 

    next = questionset.next() 
    while next and not questionset_satisfies_checks(next, runinfo): 
     next = next.next() 
    runinfo.questionset = next 
    runinfo.save() 
    if use_session: 
     request.session['prev_runcode'] = runinfo.random 

    if next is None: # we are finished 
     return finish_questionnaire(request, runinfo, questionnaire) 

    commit() 
    return redirect_to_qs(runinfo, request) 

... 

(可以根據需要發佈更多)

謝謝大家這麼多。首先在這裏發帖,希望你們能幫助新手出局。

回答

0

在您的/Users/geraldkwok/site/mysite/questionnaire/views.py文件中使用的compat模塊中沒有任何符號/方法名稱定義爲commit_on_success。只是檢查出來。可能你拼錯了或者沒有定義它。

+0

嗨@ user2393267我已經編輯帖子以包含引用commit_on_success的views.py的唯一其他部分;你能給我任何進一步的建議嗎? – korakorakora

+0

做一件事,什麼是compat?它是第三方模塊還是您自己的文件? –

+0

在得到這個錯誤之前,我還被困在runserver中,但是有一個錯誤說'不能導入compat模塊'。原來我已經在site/lib/python2.7/site-packages/pip/compat中有compat,所以我複製並粘貼到我的應用程序所在的目錄中(解決了這個錯誤,但是提出了這個) 。 – korakorakora

相關問題