Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 6, 2011 08:08:50

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно выводить статику?

Привет.
Запутался с такими вещами:

Файл settings.py

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

# Есть папка "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 = '/media/dynamic/'

# Ссылка на папку "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 = '/static/'

# Папка "static". Сюда складываются файлы для работы сайта (например, картинки, *.js и т.д.)

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

# Ссылка на папку "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 = '/media/admin/'

# Зачем это нужно?
Файл urls.py


urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
(r'^$', showImage),
(r'^media/static/(.*)$', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT
}),
(r'^media/dynamic/(.*)$', 'django.views.static.serve', {
'document_root': settings.MEDIA_ROOT
})
)
При загрузке админки: http://localhost/admin - пропадет статика. Нет ни *.css ни *.js
Как это можно исправить?
Еще вопрос, зачем параметры пути дублируются в MEDIA_URL и STATIC_URL, кода они уже прописаны в роутере?



Отредактировано (Июнь 6, 2011 08:12:26)

Офлайн

#2 Июнь 6, 2011 09:29:32

appetito
От:
Зарегистрирован: 2010-09-28
Сообщения: 147
Репутация: +  2  -
Профиль   Отправить e-mail  

Как правильно выводить статику?

во-первых MEDIA_ROOT и STATIC_ROOT - должны быть абсолютными путями
во-вторых для обработки STATIC на дев-сервере лучьше использовать это https://docs.djangoproject.com/en/1.3/ref/contrib/staticfiles/#django.contrib.staticfiles.urls.staticfiles_urlpatterns



Офлайн

#3 Июнь 6, 2011 10:10:16

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно выводить статику?

appetito
во-первых MEDIA_ROOT и STATIC_ROOT - должны быть абсолютными путями
во-вторых для обработки STATIC на дев-сервере лучьше использовать это https://docs.djangoproject.com/en/1.3/ref/contrib/staticfiles/#django.contrib.staticfiles.urls.staticfiles_urlpatterns
Сделал так.

Файл settings.py

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = 'C:/RandomQuote/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 = '/media/dynamic/'

# 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 = 'C:/RandomQuote/static/'

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/media/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 = '/media/admin/'
#ADMIN_MEDIA_ROOT = 'C:/Python27/Lib/site-packages/django/contrib/admin/media/'
Файл urls.py

url(r'^admin/', include(admin.site.urls)),
(r'^$', showImage),
(r'^media/static/(.*)$', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT
}),
(r'^media/dynamic/(.*)$', 'django.views.static.serve', {
'document_root': settings.MEDIA_ROOT
})
)

if settings.DEBUG:
urlpatterns += patterns('django.contrib.staticfiles.views',
url(r'^static/(?P<path>.*)$', 'serve'),
)
Не работает. Статика админки не подгружается…

Пробовал так:

 url(r'^admin/', include(admin.site.urls)),
(r'^$', showImage),
(r'^media/static/(.*)$', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT
}),
(r'^media/dynamic/(.*)$', 'django.views.static.serve', {
'document_root': settings.MEDIA_ROOT
})
)

if settings.DEBUG:
urlpatterns += patterns('django.contrib.staticfiles.views',
url(r'^static/(?P<path>.*)$', 'serve'),
)
urlpatterns += staticfiles_urlpatterns()
Тоже самое.
Насколько я понял из документации url(r'^static/(?P<path>.*)$', ‘serve’), ^static берет свое значение из STATIC_URL, а у меня именно в нем проблема.
Если изменить значение STATIC_URL на “/static/”, то статика админки подгружается.



Офлайн

#4 Июнь 6, 2011 10:59:10

jeltoesolnce
От:
Зарегистрирован: 2010-11-23
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно выводить статику?

Сервер какой, девелоперский или Apache?



Офлайн

#5 Июнь 6, 2011 11:36:02

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно выводить статику?

jeltoesolnce
Сервер какой, девелоперский или Apache?
Девелоп. Встроенный в Django который!



Офлайн

#6 Июнь 6, 2011 14:49:35

jeltoesolnce
От:
Зарегистрирован: 2010-11-23
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно выводить статику?

Что-то странное: по умолчанию девелоперский сервер выводит статику правильно по дефолтным настройкам settings.py, например, так:

ADMIN_MEDIA_PREFIX = '/static/admin/'
То есть, всё должно заработать, если ADMIN_MEDIA_PREFIX показывает на нужное место. Соответственно, если путь в ADMIN_MEDIA_PREFIX отличается от дефолтного, то туда, куда он ведёт, нужо “запихать” файлы со статикой админ-панели из каталога с установленной Django (не знаю, где они в Windows(R)).
Откуда пытается забрать статику броузер, можно узнать, нажав <Ctrl-U>, :-).
ИМХО, на начальном этапе с settings.py стоит обращаться осторожно).



Отредактировано (Июнь 6, 2011 14:51:06)

Офлайн

#7 Июнь 7, 2011 09:58:33

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно выводить статику?

Сделал следующим образом.

settings.py

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = 'C:/RandomQuote/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 = '/media/dynamic/'

# 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 = 'C:/RandomQuote/static/'

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/media/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 = '/media/static/admin/'
urls.py

urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
(r'^$', showImage),
(r'^media/static/(.*)$', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT
}),
(r'^media/dynamic/(.*)$', 'django.views.static.serve', {
'document_root': settings.MEDIA_ROOT
})
)
Я всегда думал, почему ADMIN_MEDIA_PREFIX из settings.py называется именно ADMIN_MEDIA_PREFIX, а не, например ADMIN_MEDIA_ROOT как в остальных параметрах.
А потом понял, что Django добавляет статику админки, в общую статику проекта.
Например, статика моего проекта лежит в STATIC_ROOT = ‘C:/RandomQuote/static/’, обращаться к ней можно по url - http://localhost/media/static/что там.jpg (или *.js или *.css)
А попробуем теперь так: http://localhost/media/static/admin/css/base.css
и мы увидим один из CSS файлов админки Django, хотя реально в этой папке у нас этого файла нет!
Дело в том, как я уже говорил, что Django автоматически добавляет свою статику к общей статике проекта.

Зачем я это пишу? По двум причинам:
1. Если я не прав в своих рассуждениях, исправьте меня!
2. Будет полезно для новичков, как я.



Офлайн

#8 Май 23, 2012 16:22:08

S
Зарегистрирован: 2012-04-25
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно выводить статику?

А если такая проблема возникает с Apache? Админка без стилей, если пытаешься открыть css файл пишет 404. Причём если запускать на сервере разработки, то там всё нормально.
Windows 7, Apache 2.2, mod_wsgi, Django 1.4, настройки все стандартные.

settings.py

# Django settings for mysite project.
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)
MANAGERS = ADMINS
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'C:/django/mysite/1',                      # 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 = 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: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = 'C:/Python27/Lib/site-packages/django/contrib/admin/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 = ''
# 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 = ''
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/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.
)
# 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 = 'w5rt22q3-2!&amp;e_4k+myr@(pk)io4yp08nbxko=x66@+3+98%-a'
# 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'
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.
    "C:/django/mysite/templates",
)
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,
        },
    }
}

mod.wsgi
import os, sys
sys.path.append('C:/Program Files (x86)/Apache Software Foundation/Apache2.2/modules')
sys.path.append('C:/django/mysite')
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Офлайн

#9 Май 23, 2012 21:20:08

S
Зарегистрирован: 2012-04-25
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно выводить статику?

Хм, в убунте та же беда

Офлайн

#10 Май 24, 2012 05:31:27

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как правильно выводить статику?

S,
дело конечно Ваше, но я бы не стал хардкодить абсолютные пути, это приводит к лишним движениям при переносе проекта на сервер, особенно если Ваш сайт будет в дальнейшем развиваться, а если работаете командой, то у каждого будет разный сентинг.пу, что опять же не есть гуд.
Лучше сделать как-то так

SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
.................
MEDIA_ROOT = os.path.join(SITE_ROOT, 'media')
STATIC_ROOT = os.path.join(SITE_ROOT, 'static_production')
UPLOAD_ROOT = os.path.join(SITE_ROOT, 'static/uploads')
....................



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version