2012-03-22 218 views
4

我想用Django開發一個網站,遵循各種指南,文檔和谷歌。我有一些平面頁面需要訪問圖像/ css文件。Django靜態文件

我的settings.py文件看起來是這樣的:

# Django settings for FirstBlog project. 

DEBUG = True 
TEMPLATE_DEBUG = DEBUG 

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

MANAGERS = ADMINS 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 
     'NAME': 'db',      # Or path to database file if using sqlite3. 
     'USER': '',      # Not used with sqlite3. 
     'PASSWORD': '',     # Not used with sqlite3. 
     'HOST': '',      # Set to empty string for localhost. Not used with sqlite3. 
     'PORT': '',      # Set to empty string for default. Not used with sqlite3. 
    } 
} 

# 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. 
# On Unix systems, a value of None will cause Django to use the same 
# timezone as the operating system. 
# If running in a Windows environment this must be set to the same as 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 = 3 

# 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 

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

# 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 = '' 

# 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 = '/export/mailgrp4_a/sc10jbr/WWWdev/FirstBlog/djangostatic/' 

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

# URL prefix for admin static files -- CSS, JavaScript and images. 
# Make sure to use a trailing slash. 
# Examples: "http://foo.com/static/admin/", "/static/admin/". 
ADMIN_MEDIA_PREFIX = '/static/admin/' 

# Additional locations of static files 
STATICFILES_DIRS = (
    '/export/mailgrp4_a/sc10jbr/WWWdev/FirstBlog/static/', 
    # 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. 
) 

# 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 = 'nc*v+e13e#!b+dq9mh-vwi0smy#r97#by1w7pvc36ez$j%rz1b' 

# 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', 
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', 
) 

ROOT_URLCONF = 'FirstBlog.urls' 

TEMPLATE_DIRS = (
    '/export/mailgrp4_a/sc10jbr/WWWdev/FirstBlog/templates', 
    # 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. 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'FirstBlog.blog', 
    'django.contrib.flatpages', 
    # 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. 
# 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, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'class': 'django.utils.log.AdminEmailHandler' 
     } 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
    } 
} 

我已經把我的圖片/ css文件中FirstBlog/static/images/css。我跑命令

python manage.py collectstatic 

它把我所有的文件在FirstBlog/djangostatic

我想從我的簡單頁面訪問圖像的index.html使用標籤:

src="{{ /static/ }}images/header.png" 

我已經包含在我的urls.py文件中這一行:

url(r'^static/(.*)$', 'django.views.static.serve', {'document_root':settings.STATIC_PATH}), 

這是給我出現以下錯誤:

Name Error at /static 

name 'settings' is not defined 

Request Method:  GET 
Request URL: http://127.0.0.1:8000/static 
Django Version:  1.3.1 
Exception Type:  NameError 
Exception Value:  

name 'settings' is not defined 

Exception Location:  /home/cserv2_a/soc_ug/sc10jbr/WWWdev/FirstBlog/../FirstBlog/urls.py in <module>, line 19 

對不起,如果這應該是顯而易見的,我花了幾個小時看着我NTERNET。

在此先感謝

回答

1

請檢查設置是否導入模塊在urls.py

+0

即時獲取錯誤:'設置'對象沒有屬性'STATIC_PATH' – 2012-03-22 14:45:07

+0

將其更改爲STATIC_ROOT。更多信息在http://stackoverflow.com/questions/6363728/why-cant-i-get-my-static-dir-to-work-with-django-1-3 – 2012-03-22 14:51:08

+0

謝謝,我覺得我即時得到某處。我的圖像標記是:logo我仍然收到一個錯誤:無法解析其餘部分:'/ static /'from'/ static /' – 2012-03-22 14:54:39

0

添加到urls.py

from django.conf import settings

+0

謝謝,我感覺像IM現在取得了一些進展。我的圖像標記是:logo我仍然收到錯誤:無法解析餘數:'/ static /'from'/ static /' – 2012-03-22 15:18:46

+1

請勿在模板變量中使用斜槓。 '{{static}}'和{{STATIC_URL}}'很好,但不是'{{/ static /}}'。 – cloudrave 2012-12-16 21:45:31

22

Django是一個夢幻般的系統的開始。功能豐富,但仍然簡單,優雅&非常有據可查,具有優秀的例子.....除了靜態內容的一切。我們在每個新的Django項目中都與此有關。但我們最近解決了這個問題,我們認爲這是「推薦」的方式。

要牢記的關鍵知識點是Django不想直接提供靜態內容。它寧願將它卸載到底層的網絡服務器(如Apache)。有很多方法可以迫使Django爲您提供服務 - 您甚至可能認爲在一個通用平臺上完成所有服務是個好主意。但請聽我的話 - 稍後你會後悔的,並希望你只是按照Django的建議。

短篇小說:

這些設置進去「settings.py」

設置STATIC_ROOT到完整的文件系統路徑,你要保持你的靜態內容。我建議您的常規Web應用程序目錄以外的地方。請記住,Apache將直接服務於此,並且您不希望在您的腳下解決安全問題。

設置STATIC_ROOT = '在/ usr /本地/靜/ MyProject的/' #包括斜線

設置STATIC_URL = '/靜態/' #沒有理由讓這個

太花哨

設置ADMIN_MEDIA_PREFIX = '/靜態/管理/' #別忘了這一個

確保默認STATICFILES_FINDERS設置:

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
    ) 

,並確保該INSTALLED_APPS設置包括 'django.contrib.staticfiles'

,並確保TEMPLATE_CONTEXT_PROCESSORS包括 'django.core.context_processors.static'

- --- NEXT ----

您將需要配置Apache以直接服務器靜態內容。從您的虛擬主機節中,添加如下內容:

Alias /static/ /usr/local/static/MyProject/ 

注:當您設置STATIC_ROOT

代替上面所用的相同路徑的路徑---- NEXT --- -

在每個應用程序文件夾中,您想要添加到您的任何東西STATIC_ROOT收集到一個名爲'static /'的子文件夾中。例如,如果您有一個名爲'controller'的應用程序,則應該有一個看起來像'controller/static'的路徑

然後從Django項目文件夾的頂部運行'collectstatic'管理子命令的.py。我們通常會創建一個腳本正是如此運行:

#!/usr/bin/sh 
# Scrtipt to collect django static files together. 
# 
# --link Create a symbolic link to each file instead of copying. 
# --noinput Do NOT prompt the user for input of any kind. 
# 
python manage.py collectstatic -link --noinput 
exit 0 

就是這樣

你並不需要在urls.py任何條目 - Django將永遠也看不到這些要求,所以沒有點添加路由條目。

下行

的一個大缺點上文所述,它違背了使用Django的TESTSERVER應用程序的方法。我們從未將它用於任何工作,並且由於我們的最終結果將始終發佈到Apache,因此我們發現最好只在那裏開發。如果你依賴'testserver' - 有辦法解決這個限制。但是,你需要通過Django的挖文檔有點https://docs.djangoproject.com/en/dev/howto/static-files/

好運

+0

所有真實但完全不相關的OP,他有一個簡單的導入錯誤。 – 2012-03-22 15:39:46

+0

感謝您的幫助,我的settings.py現在已更新。這不是一個合適的網站,它只是爲了一塊CW而放在一起,因此它將永遠不會被除了Django開發服務器之外的其他任何東西訪問。文檔說:對於本地開發,如果您使用runserver或將staticfiles_urlpatterns添加到您的URLconf中,則完成設置 - 您的靜態文件將自動在默認(用於新創建的項目)/ static /的STATIC_URL上提供。不過,我仍然收到相同的錯誤。謝謝 – 2012-03-22 15:47:41

+0

哇!即使這不是一個簡單的問題答案,我學到了很多閱讀你的文章!謝謝! – arijeet 2012-08-06 05:41:29