2013-05-06 118 views
1

我試圖在Django中使用靜態文件。當我直接訪問文件(由../static/1.txt),它給了我錯誤404或錯誤500(取決於什麼StackOverflow的答案我跟隨) 在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://stackoverflow.com/questions/14799835/django-static-files-results-in-404/14800489#14800489 – 2013-05-06 13:44:02

回答

5

在你的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配置。

4

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