错误404和500同时访问Django中的静态文件

问题描述:

我试图在Django中使用静态文件。当我直接访问文件(由../static/1.txt),它给了我错误404或错误500(取决于什么*的答案我跟随) 在Settings.py的代码如下:错误404和500同时访问Django中的静态文件

# Django settings for mysite project. 

DEBUG = True 
TEMPLATE_DEBUG = DEBUG 

ADMINS = (
    # ('Your Name', '[email protected]'), 
) 

MANAGERS = ADMINS 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 
     'NAME': '',      # Or path to database file if using sqlite3. 
     # The following settings are not used with sqlite3: 
     'USER': '', 
     'PASSWORD': '', 
     'HOST': '',      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP. 
     'PORT': '',      # Set to empty string for default. 
    } 
} 

# Hosts/domain names that are valid for this site; required if DEBUG is False 
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts 
ALLOWED_HOSTS = [] 

# Local time zone for this installation. Choices can be found here: 
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name 
# although not all choices may be available on all operating systems. 
# In a Windows environment this must be set to your system time zone. 
TIME_ZONE = 'America/Chicago' 

# Language code for this installation. All choices can be found here: 
# http://www.i18nguy.com/unicode/language-identifiers.html 
LANGUAGE_CODE = 'en-us' 

SITE_ID = 1 

# If you set this to False, Django will make some optimizations so as not 
# to load the internationalization machinery. 
USE_I18N = True 

# If you set this to False, Django will not format dates, numbers and 
# calendars according to the current locale. 
USE_L10N = True 

# If you set this to False, Django will not use timezone-aware datetimes. 
USE_TZ = True 

# Absolute filesystem path to the directory that will hold user-uploaded files. 
# Example: "/var/www/example.com/media/" 
MEDIA_ROOT = '' 

# URL that handles the media served from MEDIA_ROOT. Make sure to use a 
# trailing slash. 
# Examples: "http://example.com/media/", "http://media.example.com/" 
MEDIA_URL = '' 

# Absolute path to the directory static files should be collected to. 
# Don't put anything in this directory yourself; store your static files 
# in apps' "static/" subdirectories and in STATICFILES_DIRS. 
# Example: "/var/www/example.com/static/" 


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

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


STATIC_ROOT = '' 

# URL prefix for static files. 
# Example: "http://example.com/static/", "http://static.example.com/" 
STATIC_URL = 'C:/Python27/Lib/site-packages/django/mysite/mysite/static/' 

# Additional locations of static files 
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
# "C:/Python27/Lib/site-packages/django/mysite/mysite/static",  
    os.path.join(PROJECT_ROOT, 'static/mysite/'), 
    PROJECT_ROOT + '/static/' 
) 

# List of finder classes that know how to find static files in 
# various locations. 
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
# 'django.contrib.staticfiles.finders.DefaultStorageFinder', 
) 

# Make this unique, and don't share it with anybody. 
SECRET_KEY = '***' 

# List of callables that know how to import templates from various sources. 
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
#  'django.template.loaders.eggs.Loader', 
) 

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    # Uncomment the next line for simple clickjacking protection: 
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

ROOT_URLCONF = 'mysite.urls' 

# Python dotted path to the WSGI application used by Django's runserver. 
WSGI_APPLICATION = 'mysite.wsgi.application' 

import os.path 

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
    os.path.join(os.path.dirname(__file__), 'templates/mysite').replace('\\','/'), 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    # Uncomment the next line to enable the admin: 
    # 'django.contrib.admin', 
    # Uncomment the next line to enable admin documentation: 
    # 'django.contrib.admindocs', 
) 

# A sample logging configuration. The only tangible logging 
# performed by this configuration is to send an email to 
# the site admins on every HTTP 500 error when DEBUG=False. 
# See http://docs.djangoproject.com/en/dev/topics/logging for 
# more details on how to customize your logging configuration. 
LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     } 
    }, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler' 
     } 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
    } 
} 

这个设置文件有什么问题? 为什么我不能在我的目录“static/mysite”中访问静态文件?

这里是link to the source code of the app我想我可能失去了一些东西很简单......

+0

我不是downvote,但静态文件的网址应形式'它看起来像你一眼/静态/目录/ file.css'的是'C:/MySite/static/directory/file.css '。你能确认完整的网址给你一个404吗? – Basic 2013-05-06 11:56:36

+0

我试了2页: http://127.0.0.1:8000/static/1.txt 和http://127.0.0.1:8000/static/mysite/1.txt 既没有工作...... – user1460819 2013-05-06 12:53:28

+0

这可能帮助你太:http://*.com/questions/14799835/django-static-files-results-in-404/14800489#14800489 – 2013-05-06 13:44:02

在你的settings.py,定义STATIC_MEDIA_值:

# Absolute filesystem path to the directory that will hold user-uploaded files. 
# Example: "/home/media/media.lawrence.com/media/" 
MEDIA_ROOT = '/path/to/mydjangosite/media/' 

# URL that handles the media served from MEDIA_ROOT. Make sure to use a 
# trailing slash. 
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/" 
MEDIA_URL = 'http://www.mydjangosite.com/media/' 

# Absolute path to the directory static files should be collected to. 
# Don't put anything in this directory yourself; store your static files 
# in apps' "static/" subdirectories and in STATICFILES_DIRS. 
# Example: "/home/media/media.lawrence.com/static/" 
STATIC_ROOT = '/path/to/mydjangosite/static/' 

# URL prefix for static files. 
# Example: "http://media.lawrence.com/static/" 
STATIC_URL = 'http://www.mydjangosite.com/static/' 

此外,确保正确的STATICFILES_FINDERS配置:

# List of finder classes that know how to find static files in 
# various locations. 
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
# 'django.contrib.staticfiles.finders.DefaultStorageFinder', 
) 

必须启用AppDirectoriesFinder才能从static/收集静态文件每个应用内的子目录。此外,请确保您的应用程序包含在INSTALLED_APPS设置,否则AppDirectoriesFinder不知道到哪里寻找静态文件:

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.humanize', 
    # Uncomment the next line to enable the admin: 
    'django.contrib.admin', 
    # Uncomment the next line to enable admin documentation: 
    # 'django.contrib.admindocs', 
    # DJANGO SOUTH 
    'south', 
    # MY APPS 
    'my_django_app', 
) 

然后,收集来自各种应用程序文件夹静态的(例如MY_PROJECT /程序my_app /静态),您必须调用manage.py命令collectstatic

python manage.py collectstatic 

这会将所有的各种应用静态文件成STATIC_ROOTsettings.py指定的文件夹。


最后,确保您的静态文件夹由Web服务器直接提供,而不是通过Django WSGI应用程序提供。对于Apache2的/etc/apache2/sites-available/my_django_site.conf

<VirtualHost *:80> 
     ServerName www.mydjangosite.com 
     ServerAlias mydjangosite.com 
     ServerAdmin [email protected] 

     DocumentRoot /path/to/mydjangosite 
     <Directory /path/to/mydjangosite> 
      Options FollowSymLinks 
      AllowOverride None 
      Order allow,deny 
      allow from all 
     </Directory> 

     Alias /static/ /path/to/mydjangosite/static/ 
     <Directory /path/to/mydjangosite/static> 
       Order allow,deny 
       allow from all 
     </Directory> 

     Alias /media/ /path/to/mydjangosite/media/ 
     <Directory /path/to/mydjangosite/media> 
       Order allow,deny 
       allow from all 
     </Directory> 

     # The following installs the Django WSGI app 
     WSGIDaemonProcess www.mydjangosite.com processes=2 threads=15 display-name=%{GROUP} 
     WSGIProcessGroup www.mydjangosite.com 
     WSGIScriptAlias//path/to/mydjangosite/wsgi.py 

</VirtualHost> 

一个明确的定义AliasDirectory标签为alias'd目录将覆盖在更高级别的父目录中运行的任何应用程序WSGI。


执行sudo service apache2 restart加载新的site.conf配置。

Staticfiles在Django是在我看来框架的比较混乱的地区之一。 Django希望您将静态文件放入将在开发期间在本地投放的文件夹中,但已将收集到另一个目录以及任何其他静态媒体第三方应用程序模块可能正在使用中,因此在生产中运行的结果为manage.py collectstatic

这里是我使用的目录结构,以及一个辅助函数,使生活一点点的问候静态文件更容易...

# A Sample Project structure 

/sample_app 
    manage.py 
    /sample_app 

    # this directory is served by the 'staticfiles' app during development 
    # as specified by STATICFILES_DIRS for the location of the files 
    # and a STATIC_URL of '/static/' 
    /static-assets/ 
     /css 
     /js 
     /images 

    # this directory is where all of the folders and files specified in the 
    # STATICFILES_DIRS setting get collected to for deployment. The files 
    # will be collected to the directory specified by the STATIC_ROOT setting. 
    /static 


# settings.py 

import os 

# a helper function to return absolute paths, using settings.py 
# as a starting point. This assumes Django >= 1.4.x 
def map_path(directory_name): 
    return os.path.join(os.path.dirname(__file__), 
     '../' + directory_name).replace('\\', '/') 

MEDIA_ROOT = map_path('static/uploads/') 
MEDIA_URL = '/static/uploads/' 

STATIC_ROOT = map_path('static') 
STATIC_URL = '/static/' 

STATICFILES_DIRS = (
    map_path('static-assets'), 
) 

# You can also use map_path for other paths, like templates 
TEMPLATE_DIRS = (
    map_path('templates), 
) 

TEMPLATE_CONTEXT_PROCESSORS = (
    ... 
    'django.core.context_processors.request', 
    'django.core.context_processors.static' 
    ... 
) 

那么你应该能够引用您的模板作为静态文件:

<link type="text/css" rel="stylesheet" 
    href="{{ STATIC_URL }}css/base.css" media="screen,projection" /> 

另一个潜在的疑难杂症是,staticfiles程序只适用在DEBUG = True

+0

我应该在你的代码更改“../”喜欢的东西我绝对文件路径? – user1460819 2013-05-06 12:56:55

+0

我应该在127.0.0.1:8000/static/1.txt中寻找这种情况下的静态文件吗?或者别的地方? – user1460819 2013-05-06 13:00:57

+0

我一直以为是静态文件未在生产服务,但OP的配置显示'DEBUG = FALSE'所以它可能不是问题_yet_。完全一致回复:这是Django的新手的一大疑难杂症 - 抓住我出去过 – Basic 2013-05-06 13:02:24