5

我需要一点帮助,我一直在寻找没有结果的解决方案。

这是我的设置:settings.py:

STATIC_ROOT = ''

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"

STATIC_URL = '/static/'

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

STATICFILES_DIRS = (
    PROJECT_ROOT + '/static/'
)

已安装的应用程序:

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin', . . .

使用 DEBUG = TRUE 运行:

August 01, 2013 - 16:59:44
Django version 1.5.1, using settings 'settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[01/Aug/2013 16:59:50] "GET / HTTP/1.1" 200 6161
[01/Aug/2013 16:59:50] "GET /static/media/css/jquery-ui/ui-lightness/jquery-ui-    1.10.3.custom.min.css HTTP/1.1" 404 5904
[01/Aug/2013 16:59:50] "GET /static/media/css/bootstrap/bootstrap.css HTTP/1.1" 404 5904
[01/Aug/2013 16:59:50] "GET /static/media/css/bootstrap/bootstrap-responsive.min.css     HTTP/1.1" 404 5904
[01/Aug/2013 16:59:50] "GET /static/media/css/styles.css HTTP/1.1" 404 5904
[01/Aug/2013 16:59:50] "GET /static/media/js/jquery/jquery-1.9.1.min.js HTTP/1.1" 404 5904
[01/Aug/2013 16:59:50] "GET /static/media/js/bootstrap/bootstrap.min.js HTTP/1.1" 404 5904
[01/Aug/2013 16:59:50] "GET /static/media/js/jquery-ui/jquery-ui-1.10.3.custom.min.js HTTP/1.1" 404 5904
[01/Aug/2013 16:59:50] "GET /static/media/js/messages.js HTTP/1.1" 404 5904
[01/Aug/2013 16:59:50] "GET /static/media/js/validate/jquery.validate.min.js HTTP/1.1" 404 5904
[01/Aug/2013 16:59:50] "GET /static/media/images/FERREMOLQUES2.png HTTP/1.1" 404 5904
[01/Aug/2013 16:59:50] "GET /static/media/js/dynamic-style.js HTTP/1.1" 404 5904

作为特别提及,我在VIRTUALENV中运行 Django 1.5.1 和 Python 2.7.5 。我不知道这个配置是否导致问题

任何帮助将不胜感激

谢谢。

编辑:当我关闭 VIRTUALENV 并安装正确版本的 Django 和项目的依赖项时,我的项目运行良好,没有任何问题。. . 静态显示为应有的

4

3 回答 3

9

你确定你STATICFILE_DIRS的正确吗?如果您的设置与当前相同,则该static文件夹应该与settings.py.

PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) # it means settings.py is in PROJECT_ROOT?
STATICFILES_DIRS = (
    PROJECT_ROOT + '/static/', # <= don't forget a comma here
)

我的正常settings.py情况有点不同:

ROOT_PATH = path.join(path.dirname(__file__), '..')  # up one level from settings.py
STATICFILES_DIRS = (
    path.abspath(path.join(ROOT_PATH, 'static')), # static is on root level
)

除此之外,您需要django.core.context_processors.static作为上下文处理器:

TEMPLATE_CONTEXT_PROCESSORS = (
    # other context processors....
    'django.core.context_processors.static',
)

并在以下位置启用 urlpattern urls.py

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()

希望能帮助到你!

于 2013-08-01T22:47:26.420 回答
3

经过数小时搜索任何解决方案,最后我发现这个问题是一个错误:

https://bugzilla.redhat.com/show_bug.cgi?id=962223

我不确定这个错误是由 Django 还是 Python 引起的,我的 Django 版本是 1.5.1 而 Python 是 2.7.5。我需要在以前的 django 和 python 版本中进行证明以查看是否存在错误。

当我将其更改为 True 时,我的 setting.py 就在DEBUG=False其中,问题已经消失,现在正在开发中,我并不担心,但是当我的项目投入生产时,我会等待补丁。

再次感谢。

于 2013-08-02T20:51:19.367 回答
1

发生此问题是因为在非调试模式下,静态文件处理程序是 WSGI,根据以下代码行,它不处理 settings.STATIC_ROOT 路径 -

文件位置 - django.contrib.staticfiles.management.commands.runserver

def get_handler(self, *args, **options):
    """
    Returns the static files serving handler wrapping the default handler,
    if static files should be served. Otherwise just returns the default
    handler.

    """
    handler = super(Command, self).get_handler(*args, **options)
    use_static_handler = options.get('use_static_handler', True)
    insecure_serving = options.get('insecure_serving', False)
    if use_static_handler and (settings.DEBUG or insecure_serving):
        return StaticFilesHandler(handler)
    return handler

为了解决这个问题,我添加了一个其他检查,如下面的代码所示,它工作正常。

  def get_handler(self, *args, **options):
        """
        Returns the static files serving handler wrapping the default handler,
        if static files should be served. Otherwise just returns the default
        handler.

        """
        handler = super(Command, self).get_handler(*args, **options)
        use_static_handler = options.get('use_static_handler', True)
        insecure_serving = options.get('insecure_serving', False)
        if use_static_handler and (settings.DEBUG or insecure_serving):
            return StaticFilesHandler(handler)
        elif use_static_handler: 
            return StaticFilesHandler(handler)
        return handler

谢谢,
高拉夫

于 2013-11-02T11:46:16.940 回答