Django值错误尝试导入超出顶级

时间:2018-03-26 14:23:37

标签: python django packages

我正在尝试为我带入的django项目运行一套测试。使用python manage.py test --settings=tRecorderApi.settings_test在Power Shell环境中运行测试将返回以下输出:

Creating test database for alias 'default'...
DEBUG 2018-03-26 09:05:56,124 base 276900 275184 Configuring Raven for host: http://sentry:9000
EEEEEEEEEEEEEEEE
======================================================================
ERROR: file_transfer (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: file_transfer
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python36-32\lib\unittest\loader.py", line 462, in _find_test_path
    package = self._get_module_from_name(name)
  File "C:\Program Files (x86)\Python36-32\lib\unittest\loader.py", line 369, in _get_module_from_name
    __import__(name)
  File "C:\Users\dipinton\tE-backend\tRecorderApi\api\file_transfer\__init__.py", line 1, in <module>
    from .FileUtility import *
  File "C:\Users\dipinton\tE-backend\tRecorderApi\api\file_transfer\FileUtility.py", line 12, in <module>
    from ..models.language import Language
ValueError: attempted relative import beyond top-level package


======================================================================
ERROR: models (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: models
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python36-32\lib\unittest\loader.py", line 462, in _find_test_path
    package = self._get_module_from_name(name)
  File "C:\Program Files (x86)\Python36-32\lib\unittest\loader.py", line 369, in _get_module_from_name
    __import__(name)
  File "C:\Users\dipinton\tE-backend\tRecorderApi\api\models\__init__.py", line 1, in <module>
    from .book import Book
  File "C:\Users\dipinton\tE-backend\tRecorderApi\api\models\book.py", line 4, in <module>
    class Book(models.Model):
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\models\base.py", line 118, in __new__
    "INSTALLED_APPS." % (module, name)
RuntimeError: Model class models.book.Book doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

----------------------------------------------------------------------
Ran 16 tests in 0.000s

FAILED (errors=16)
System check identified no issues (0 silenced).
Destroying test database for alias 'default'...

其余的测试结果与ValueError: attempted relative import beyond top-level package的第一个看起来相同。

我的文件夹结构如下所示(唯一重要的文件位于第一个tRecorderApi文件夹下):

C:.
|   .gitignore
|   api_spec.txt
|   postgres-setup
|   README.md
|   __init__.py
|   
+---InstallationScripts
|   |   README.md
|   |   
|   +---translationExchangeRpi
|   |   |   install.deb
|   |   |   prepare.sh
|   |   |   uninstall.sh
|   |   |   
|   |   \---install
|   |       +---DEBIAN
|   |       |       control
|   |       |       postinst
|   |       |       
|   |       \---tmp
|   |           \---tex_install
|   |               +---config
|   |               |       dhcpcd.conf
|   |               |       hosts
|   |               |       tex_autorun.sh
|   |               |       
|   |               \---TranslationExchange
|   |                   |   docker-compose.yml
|   |                   |   Dockerfile
|   |                   |   
|   |                   +---ap
|   |                   |       dnsmasq.conf
|   |                   |       Dockerfile
|   |                   |       entrypoint.sh
|   |                   |       hostapd
|   |                   |       hostapd.conf
|   |                   |       
|   |                   \---config
|   |                       |   config.py
|   |                       |   requirements.txt
|   |                       |   rootCA.crt
|   |                       |   self-signed.conf
|   |                       |   server.crt
|   |                       |   server.key
|   |                       |   ssl-params.conf
|   |                       |   
|   |                       \---nginx
|   |                               trapi.conf
|   |                               
|   \---translationExchangeVM
|       |   install
|       |   prepare
|       |   software
|       |   uninstall
|       |   
|       +---autorun
|       |       tex_autorun.sh
|       |       
|       \---TranslationExchange
|           |   docker-compose.yml
|           |   Dockerfile
|           |   
|           \---config
|               |   config.py
|               |   requirements.txt
|               |   rootCA.crt
|               |   self-signed.conf
|               |   server.crt
|               |   server.key
|               |   ssl-params.conf
|               |   
|               \---nginx
|                       trapi.conf
|                       
+---tRecorderApi
|   |   books.json
|   |   db.sqlite3
|   |   langnames.json
|   |   manage.py
|   |   requirements.txt
|   |   swaggerAPI.yaml
|   |   wmta.py
|   |   __init__.py
|   |   
|   +---api
|   |   |   admin.py
|   |   |   apps.py
|   |   |   parsers.py
|   |   |   serializers.py
|   |   |   tasks.py
|   |   |   urls.py
|   |   |   
|   |   +---file_transfer
|   |   |   |   ArchiveIt.py
|   |   |   |   ArchiveProject.py
|   |   |   |   AudioUtility.py
|   |   |   |   Download.py
|   |   |   |   FileTransfer.py
|   |   |   |   FileUtility.py
|   |   |   |   tinytag.py
|   |   |   |   TrIt.py
|   |   |   |   Upload.py
|   |   |   |   ZipIt.py
|   |   |   |   __init__.py
|   |   |   |   
|   |   |   \---__pycache__
|   |   |           ArchiveIt.cpython-36.pyc
|   |   |           ArchiveProject.cpython-36.pyc
|   |   |           AudioUtility.cpython-36.pyc
|   |   |           Download.cpython-36.pyc
|   |   |           FileTransfer.cpython-36.pyc
|   |   |           FileUtility.cpython-36.pyc
|   |   |           tinytag.cpython-36.pyc
|   |   |           TrIt.cpython-36.pyc
|   |   |           Upload.cpython-36.pyc
|   |   |           ZipIt.cpython-36.pyc
|   |   |           __init__.cpython-36.pyc
|   |   |           
|   |   +---migrations
|   |   |   |   0001_initial.py
|   |   |   |   __init__.py
|   |   |   |   
|   |   |   \---__pycache__
|   |   |           0001_initial.cpython-36.pyc
|   |   |           __init__.cpython-36.pyc
|   |   |           
|   |   +---models
|   |   |   |   anthology.py
|   |   |   |   book.py
|   |   |   |   chapter.py
|   |   |   |   chunk.py
|   |   |   |   comment.py
|   |   |   |   language.py
|   |   |   |   mode.py
|   |   |   |   project.py
|   |   |   |   take.py
|   |   |   |   version.py
|   |   |   |   __init__.py
|   |   |   |   
|   |   |   \---__pycache__
|   |   |           anthology.cpython-36.pyc
|   |   |           book.cpython-36.pyc
|   |   |           chapter.cpython-36.pyc
|   |   |           chunk.cpython-36.pyc
|   |   |           comment.cpython-36.pyc
|   |   |           language.cpython-36.pyc
|   |   |           mode.cpython-36.pyc
|   |   |           project.cpython-36.pyc
|   |   |           take.cpython-36.pyc
|   |   |           version.cpython-36.pyc
|   |   |           __init__.cpython-36.pyc
|   |   |           
|   |   +---templates
|   |   |       index.html
|   |   |       
|   |   +---tests
|   |   |   |   tests_books.py
|   |   |   |   tests_get_projects.py
|   |   |   |   tests_upload.py
|   |   |   |   test_api_anthologies.py
|   |   |   |   test_api_books.py
|   |   |   |   test_api_chapters.py
|   |   |   |   test_api_chunks.py
|   |   |   |   test_api_comments.py
|   |   |   |   test_api_languages.py
|   |   |   |   test_api_modes.py
|   |   |   |   test_api_projects.py
|   |   |   |   test_api_takes.py
|   |   |   |   test_api_versions.py
|   |   |   |   test_api_zip.py
|   |   |   |   __init__.py
|   |   |   |   
|   |   |   \---__pycache__
|   |   |           tests_books.cpython-36.pyc
|   |   |           tests_get_projects.cpython-36.pyc
|   |   |           tests_upload.cpython-36.pyc
|   |   |           test_api_anthologies.cpython-36.pyc
|   |   |           test_api_books.cpython-36.pyc
|   |   |           test_api_chapters.cpython-36.pyc
|   |   |           test_api_chunks.cpython-36.pyc
|   |   |           test_api_comments.cpython-36.pyc
|   |   |           test_api_languages.cpython-36.pyc
|   |   |           test_api_modes.cpython-36.pyc
|   |   |           test_api_projects.cpython-36.pyc
|   |   |           test_api_takes.cpython-36.pyc
|   |   |           test_api_versions.cpython-36.pyc
|   |   |           test_api_zip.cpython-36.pyc
|   |   |           __init__.cpython-36.pyc
|   |   |           
|   |   +---views
|   |   |   |   anthology.py
|   |   |   |   book.py
|   |   |   |   chapter.py
|   |   |   |   chunk.py
|   |   |   |   comment.py
|   |   |   |   exclude_files.py
|   |   |   |   file_upload.py
|   |   |   |   frontend.py
|   |   |   |   helpers.py
|   |   |   |   index.py
|   |   |   |   language.py
|   |   |   |   mode.py
|   |   |   |   project.py
|   |   |   |   push_takes.py
|   |   |   |   resumable_upload.py
|   |   |   |   source_file.py
|   |   |   |   source_file_upload.py
|   |   |   |   stitch_takes.py
|   |   |   |   take.py
|   |   |   |   tr.py
|   |   |   |   update_project_takes.py
|   |   |   |   user.py
|   |   |   |   version.py
|   |   |   |   zip.py
|   |   |   |   __init__.py
|   |   |   |   
|   |   |   \---__pycache__
|   |   |           anthology.cpython-36.pyc
|   |   |           book.cpython-36.pyc
|   |   |           chapter.cpython-36.pyc
|   |   |           chunk.cpython-36.pyc
|   |   |           comment.cpython-36.pyc
|   |   |           exclude_files.cpython-36.pyc
|   |   |           file_upload.cpython-36.pyc
|   |   |           frontend.cpython-36.pyc
|   |   |           helpers.cpython-36.pyc
|   |   |           index.cpython-36.pyc
|   |   |           language.cpython-36.pyc
|   |   |           mode.cpython-36.pyc
|   |   |           project.cpython-36.pyc
|   |   |           push_takes.cpython-36.pyc
|   |   |           resumable_upload.cpython-36.pyc
|   |   |           source_file.cpython-36.pyc
|   |   |           source_file_upload.cpython-36.pyc
|   |   |           stitch_takes.cpython-36.pyc
|   |   |           take.cpython-36.pyc
|   |   |           tr.cpython-36.pyc
|   |   |           version.cpython-36.pyc
|   |   |           zip.cpython-36.pyc
|   |   |           __init__.cpython-36.pyc
|   |   |           
|   |   \---__pycache__
|   |           admin.cpython-36.pyc
|   |           serializers.cpython-36.pyc
|   |           tasks.cpython-36.pyc
|   |           urls.cpython-36.pyc
|   |           __init__.cpython-36.pyc
|   |           
|   +---static
|   |   |   loader.gif
|   |   |   resumable.js
|   |   |   
|   |   \---chunks
|   |       +---nt
|   |       |   +---1co
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---1jn
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---1pe
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---1th
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---1ti
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---2co
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---2jn
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---2pe
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---2th
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---2ti
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---3jn
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---act
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---col
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---eph
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---gal
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---heb
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---jas
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---jhn
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---jud
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---luk
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---mat
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---mrk
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---phm
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---php
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---rev
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   +---rom
|   |       |   |       chunks.json
|   |       |   |       
|   |       |   \---tit
|   |       |           chunks.json
|   |       |           
|   |       \---ot
|   |           +---1ch
|   |           |       chunks.json
|   |           |       
|   |           +---1ki
|   |           |       chunks.json
|   |           |       
|   |           +---1sa
|   |           |       chunks.json
|   |           |       
|   |           +---2ch
|   |           |       chunks.json
|   |           |       
|   |           +---2ki
|   |           |       chunks.json
|   |           |       
|   |           +---2sa
|   |           |       chunks.json
|   |           |       
|   |           +---amo
|   |           |       chunks.json
|   |           |       
|   |           +---dan
|   |           |       chunks.json
|   |           |       
|   |           +---deu
|   |           |       chunks.json
|   |           |       
|   |           +---ecc
|   |           |       chunks.json
|   |           |       
|   |           +---est
|   |           |       chunks.json
|   |           |       
|   |           +---exo
|   |           |       chunks.json
|   |           |       
|   |           +---ezk
|   |           |       chunks.json
|   |           |       
|   |           +---ezr
|   |           |       chunks.json
|   |           |       
|   |           +---gen
|   |           |       chunks.json
|   |           |       
|   |           +---hab
|   |           |       chunks.json
|   |           |       
|   |           +---hag
|   |           |       chunks.json
|   |           |       
|   |           +---hos
|   |           |       chunks.json
|   |           |       
|   |           +---isa
|   |           |       chunks.json
|   |           |       
|   |           +---jdg
|   |           |       chunks.json
|   |           |       
|   |           +---jer
|   |           |       chunks.json
|   |           |       
|   |           +---job
|   |           |       chunks.json
|   |           |       
|   |           +---jol
|   |           |       chunks.json
|   |           |       
|   |           +---jon
|   |           |       chunks.json
|   |           |       
|   |           +---jos
|   |           |       chunks.json
|   |           |       
|   |           +---lam
|   |           |       chunks.json
|   |           |       
|   |           +---lev
|   |           |       chunks.json
|   |           |       
|   |           +---mal
|   |           |       chunks.json
|   |           |       
|   |           +---mic
|   |           |       chunks.json
|   |           |       
|   |           +---nam
|   |           |       chunks.json
|   |           |       
|   |           +---neh
|   |           |       chunks.json
|   |           |       
|   |           +---num
|   |           |       chunks.json
|   |           |       
|   |           +---oba
|   |           |       chunks.json
|   |           |       
|   |           +---pro
|   |           |       chunks.json
|   |           |       
|   |           +---psa
|   |           |       chunks.json
|   |           |       
|   |           +---rut
|   |           |       chunks.json
|   |           |       
|   |           +---sng
|   |           |       chunks.json
|   |           |       
|   |           +---zec
|   |           |       chunks.json
|   |           |       
|   |           \---zep
|   |                   chunks.json
|   |                   
|   +---tRecorderApi
|   |   |   celery.py
|   |   |   settings.py
|   |   |   settings_test.py
|   |   |   urls.py
|   |   |   wsgi.py
|   |   |   __init__.py
|   |   |   
|   |   \---__pycache__
|   |           celery.cpython-36.pyc
|   |           settings.cpython-36.pyc
|   |           settings_test.cpython-36.pyc
|   |           urls.cpython-36.pyc
|   |           wsgi.cpython-36.pyc
|   |           __init__.cpython-36.pyc
|   |           
|   \---__pycache__
|           __init__.cpython-36.pyc
|           
\---__pycache__
        __init__.cpython-36.pyc

基于类似的问题,我怀疑这可能与每个文件夹中的__init__.py文件有关。我已经从'api'文件夹中删除了一个,该文件夹应该是项目的根目录(这就是我开始收到值错误的原因)。在此之前,我收到第二个测试中显示的错误,其中抱怨我的模型不在我的设置文件中的已安装应用程序列表中。我使用的设置文件如下所示:

"""
Django settings for tRecorderApi project.

Generated by 'django-admin startproject' using Django 1.11.2.

For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""

import os
import raven

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '&9e^=922_&wi-bw@bbe$id#r$7hb(im03nrow5w@tgg8##hfd('

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['192.168.96.21', '172.19.145.91',
                 '172.19.145.88', 'localhost', '127.0.0.1', 'te.loc']

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'corsheaders',
    'api',
    'django_celery_results',
    'drf_yasg',
    'raven.contrib.django.raven_compat',
]


MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

"""REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}"""

CORS_ORIGIN_ALLOW_ALL = True

ROOT_URLCONF = 'tRecorderApi.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'api/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 = 'tRecorderApi.wsgi.application'

# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3')
    }
}
# DATABASES = {
    # 'default': {
        # 'ENGINE': 'django.db.backends.postgresql_psycopg2',
        # 'NAME': 'postgres',
        # 'USER': 'postgres',
        # 'HOST': 'db',
        # 'PORT': 5432,
    # }
# }

RAVEN_CONFIG = {
    'dsn': 'http://2e7130f730eb42dfa6bbe67875dfd8ee:15b0167a7b714b7697a63e6678081e3b@sentry:9000/2',
    # If you are using git, you can also automatically configure the
    # release based on the git info.
    'release': raven.fetch_git_sha(os.path.abspath(os.pardir)),
}

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'root': {
        'level': 'WARNING',
        'handlers': ['sentry'],
    },
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s '
                      '%(process)d %(thread)d %(message)s'
        },
    },
    'handlers': {
        'sentry': {
            # To capture more than ERROR, change to WARNING, INFO, etc.
            'level': 'INFO',
            'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
            'tags': {'custom-tag': 'x'},
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'ERROR',
            'handlers': ['console'],
            'propagate': False,
        },
        'raven': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
        'sentry.errors': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
    },
}

# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

STATIC_ROOT = 'static'
STATIC_URL = '/static/'

# MEDIA_ROOT = 'media'
# MEDIA_URL = '/media/'

REACT_APP_DIR = os.path.join(BASE_DIR, 'frontend')

STATICFILES_DIRS = [
    os.path.join(REACT_APP_DIR, 'build', 'static'),
]
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

SECURE_SSL_REDIRECT = False
SESSION_COOKIE_SECURE = False
CSRF_COOKIE_SECURE = False

# celery
CELERY_BROKER_URL = 'amqp://te:te@rabbit:5672'
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'
CELERY_ACCEPT_CONTENT = ['pickle']
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_RESULT_SERIALIZER = 'pickle'
CELERY_IGNORE_RESULT = False
CELERY_TASK_TRACK_STARTED = True

我的问题是,我是否需要删除所有__init__.py个文件?我需要更改设置中的某些内容才能使测试正常运行吗?或者我的问题与我的想法完全不同?

1 个答案:

答案 0 :(得分:0)

看起来我能解决自己的问题。在这种情况下,我进行了git重置,将我的 init .py文件恢复到我的api目录中。从那里,我将DJANG_SETTINGS_MODULE环境变量设置为指向我的自定义设置文件。我使用Windows 10机器,因此命令如下所示:

set DJANGO_SETTINGS_MODULE=tRecorderApi.settings_test

运行上面的两个步骤让我的测试在没有值错误的情况下运行。