Cartoview执行paver setup_geoserver时遇变量未定义错误求助
安装Cartoview GeoServer组件时的配置错误解决
问题描述
执行paver setup_geoserver命令时出现以下错误:
File "/home/developer/cartoview/cartoview/settings.py", line 24, in <module> INSTALLED_APPS += CARTOVIEW_INSTALLED_APPS NameError: name 'INSTALLED_APPS' is not defined
除INSTALLED_APPS外,TEMPLATES、STATICFILES_DIRS、MEDIAFILES_LOCATION等变量也存在未定义问题,手动定义后又出现索引越界错误。相关配置代码如下:
# -*- coding: utf-8 -*- from __future__ import print_function import ast import copy import os import re import sys import dj_database_url from distutils.util import strtobool from geonode.settings import * # noqa from kombu import Exchange, Queue import cartoview PROJECT_NAME = "cartoview" CARTOVIEW_INSTALLED_APPS = ("cartoview", "cartoview.cartoview_api.apps.CartoviewAPIConfig", "cartoview.store_api.apps.StoreApiConfig", "cartoview.app_manager", "cartoview.apps_handler.apps.AppsHandlerConfig") INSTALLED_APPS += CARTOVIEW_INSTALLED_APPS GEONODE_APPS_NAV_MENU_ENABLE = ast.literal_eval(os.getenv("GEONODE_APPS_NAV_MENU_ENABLE", "False")) ROOT_URLCONF = os.getenv('ROOT_URLCONF', "cartoview.urls") CARTOVIEW_DIR = os.path.abspath(os.path.dirname(cartoview.__file__)) BASE_DIR = os.path.dirname(CARTOVIEW_DIR) CARTOVIEW_TEMPLATE_DIRS = [ os.path.join(CARTOVIEW_DIR, "templates") ] TEMPLATES[0]["DIRS"] = CARTOVIEW_TEMPLATE_DIRS + TEMPLATES[0]["DIRS"] CARTOVIEW_STATIC_DIRS = [ os.path.join(CARTOVIEW_DIR, "static"), ] STATICFILES_DIRS = CARTOVIEW_STATIC_DIRS + STATICFILES_DIRS APPS_DIR = os.getenv('APPS_DIR', os.path.abspath(os.path.join(os.path.dirname(CARTOVIEW_DIR), "apps"))) PENDING_APPS = os.path.join(APPS_DIR, "pendingOperation.yml") APPS_MENU = False DOCKER = os.getenv('DOCKER', False) CARTOVIEW_CONTEXT_PROCESSORS = ('cartoview.app_manager.context_processors.cartoview_processor',) TEMPLATES[0]["OPTIONS"]['context_processors'] += CARTOVIEW_CONTEXT_PROCESSORS # django Media Section MEDIA_ROOT = os.getenv('MEDIA_ROOT', os.path.join(BASE_DIR, MEDIAFILES_LOCATION)) # static section STATIC_ROOT = os.getenv('STATIC_ROOT', os.path.join(BASE_DIR, STATICFILES_LOCATION)) DATABASE_URL = os.getenv( 'DATABASE_URL', 'spatialite:////{}/database.db'.format( os.path.dirname(CARTOVIEW_DIR))) DATASTORE_DATABASE_URL = os.getenv('DATASTORE_DATABASE_URL', None) if DATABASE_URL: DATABASES['default'] = dj_database_url.parse( DATABASE_URL, conn_max_age=0) if DATASTORE_DATABASE_URL: DATABASES['datastore'] = dj_database_url.parse( DATASTORE_DATABASE_URL, conn_max_age=0) CARTOVIEW_TEST = 'test' in sys.argv or ast.literal_eval( os.getenv('CARTOVIEW_TEST', "False")) or 'run_cartoview_test' in sys.argv # if CARTOVIEW_TEST: # DATABASES = { # 'default': { # 'ENGINE': 'django.contrib.gis.db.backends.spatialite', # 'NAME': os.path.join(BASE_DIR, 'test.db') # } # } if 'datastore' in DATABASES: OGC_SERVER['default']['DATASTORE'] = 'datastore' if 'geonode.geoserver' in INSTALLED_APPS and "LOCAL_GEOSERVER" in \ locals() and LOCAL_GEOSERVER in MAP_BASELAYERS: LOCAL_GEOSERVER["source"][ "url"] = OGC_SERVER['default']['PUBLIC_LOCATION'] + "wms" # Logging settings # 'DEBUG', 'INFO', 'WARNING', 'ERROR', or 'CRITICAL' DJANGO_LOG_LEVEL = os.getenv('DJANGO_LOG_LEVEL', 'ERROR') installed_apps_conf = { 'handlers': ['console'], 'level': DJANGO_LOG_LEVEL, } LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': ('%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d' ' %(message)s'), }, }, 'handlers': { 'console': { 'level': DJANGO_LOG_LEVEL, 'class': 'logging.StreamHandler', 'formatter': 'verbose', } }, 'loggers': {app: copy.deepcopy(installed_apps_conf) for app in INSTALLED_APPS}, 'root': { 'handlers': ['console'], 'level': DJANGO_LOG_LEVEL }, } LOGGING['loggers']['django.db.backends'] = { 'handlers': ['console'], 'propagate': False, 'level': 'WARNING', # Django SQL logging is too noisy at DEBUG } from cartoview import app_manager from past.builtins import execfile app_manager_settings = os.path.join( os.path.dirname(app_manager.__file__), "settings.py") execfile(os.path.realpath(app_manager_settings)) load_apps(APPS_DIR) INSTALLED_APPS += CARTOVIEW_APPS for settings_file in APPS_SETTINGS: try: execfile(settings_file) except Exception as e: print(e) # Location of translation files _DEFAULT_LOCALE_PATHS = ( os.path.join(BASE_DIR, "locale"), ) LOCALE_PATHS = os.getenv('LOCALE_PATHS', _DEFAULT_LOCALE_PATHS) try: from .local_settings import * # noqa except Exception as e: print(e)
核心原因
这些错误是因为from geonode.settings import *未正确导入GeoNode的基础配置变量,可能是GeoNode安装不完整、路径错误,或者Cartoview与GeoNode版本不兼容导致的。手动定义变量时未考虑TEMPLATES等结构的完整性,进而引发索引越界。
解决步骤
1. 验证GeoNode配置导入有效性
在终端执行以下命令,检查GeoNode的基础配置能否正常导入:
python -c "from geonode.settings import INSTALLED_APPS, TEMPLATES; print('INSTALLED_APPS导入成功'); print('TEMPLATES长度:', len(TEMPLATES))"
如果报错,说明GeoNode未正确安装,需重新安装Cartoview官方文档指定版本的GeoNode。
2. 修改settings.py添加变量兜底初始化
修改cartoview/settings.py,在使用GeoNode变量前添加兜底初始化,确保变量存在且结构完整:
# -*- coding: utf-8 -*- from __future__ import print_function import ast import copy import os import re import sys import dj_database_url from distutils.util import strtobool # 优先导入GeoNode配置 from geonode.settings import * # noqa from kombu import Exchange, Queue import cartoview PROJECT_NAME = "cartoview" # 兜底初始化INSTALLED_APPS if 'INSTALLED_APPS' not in locals(): INSTALLED_APPS = [] CARTOVIEW_INSTALLED_APPS = ("cartoview", "cartoview.cartoview_api.apps.CartoviewAPIConfig", "cartoview.store_api.apps.StoreApiConfig", "cartoview.app_manager", "cartoview.apps_handler.apps.AppsHandlerConfig") INSTALLED_APPS += CARTOVIEW_INSTALLED_APPS GEONODE_APPS_NAV_MENU_ENABLE = ast.literal_eval(os.getenv("GEONODE_APPS_NAV_MENU_ENABLE", "False")) ROOT_URLCONF = os.getenv('ROOT_URLCONF', "cartoview.urls") CARTOVIEW_DIR = os.path.abspath(os.path.dirname(cartoview.__file__)) BASE_DIR = os.path.dirname(CARTOVIEW_DIR) CARTOVIEW_TEMPLATE_DIRS = [ os.path.join(CARTOVIEW_DIR, "templates") ] # 兜底初始化TEMPLATES结构 if 'TEMPLATES' not in locals() or len(TEMPLATES) == 0: TEMPLATES = [{ "DIRS": [], "OPTIONS": { "context_processors": [] } }] TEMPLATES[0]["DIRS"] = CARTOVIEW_TEMPLATE_DIRS + TEMPLATES[0]["DIRS"] CARTOVIEW_STATIC_DIRS = [ os.path.join(CARTOVIEW_DIR, "static"), ] # 兜底初始化STATICFILES_DIRS if 'STATICFILES_DIRS' not in locals(): STATICFILES_DIRS = [] STATICFILES_DIRS = CARTOVIEW_STATIC_DIRS + STATICFILES_DIRS APPS_DIR = os.getenv('APPS_DIR', os.path.abspath(os.path.join(os.path.dirname(CARTOVIEW_DIR), "apps"))) PENDING_APPS = os.path.join(APPS_DIR, "pendingOperation.yml") APPS_MENU = False DOCKER = os.getenv('DOCKER', False) CARTOVIEW_CONTEXT_PROCESSORS = ('cartoview.app_manager.context_processors.cartoview_processor',) TEMPLATES[0]["OPTIONS"]['context_processors'] += CARTOVIEW_CONTEXT_PROCESSORS # django Media Section # 兜底初始化MEDIAFILES_LOCATION if 'MEDIAFILES_LOCATION' not in locals(): MEDIAFILES_LOCATION = 'media' MEDIA_ROOT = os.getenv('MEDIA_ROOT', os.path.join(BASE_DIR, MEDIAFILES_LOCATION)) # static section # 兜底初始化STATICFILES_LOCATION if 'STATICFILES_LOCATION' not in locals(): STATICFILES_LOCATION = 'static' STATIC_ROOT = os.getenv('STATIC_ROOT', os.path.join(BASE_DIR, STATICFILES_LOCATION)) # 后续代码保持不变...
3. 重新执行安装命令
修改完成后,激活虚拟环境(如果使用),重新执行:
paver setup_geoserver
4. 额外检查项
- 确认Cartoview与GeoNode版本匹配,参考官方文档的版本要求
- 确保所有依赖安装完整:
pip install -r requirements.txt
内容的提问来源于stack exchange,提问作者Muhammad Waqar Anwar
相关产品推荐
相关产品推荐

