为 Django 静态文件提供服务时的 Apache 403 [英] Apache 403 while serving Django static files
问题描述
我浏览了很多相关帖子,但似乎没有任何帮助.
相关信息:
I've looked through a lot of the related posts but nothing seems to be helping.
Relevant Info:
Django 版本 - 1.4
Django version - 1.4
Apache 版本 - 2.2
Apache version - 2.2
Python 版本 - 2.7
Python version - 2.7
操作系统 - Xubuntu 12.04
OS - Xubuntu 12.04
数据库-Mysql
我正在尝试让 Apache 为 django 应用程序和静态文件提供服务.该问题在无法显示任何 CSS 样式或图像的管理站点中变得明显.我的管理网站目前看起来像:
I'm trying to get Apache to serve both the django app and static files. The issue become apparent in the admin site which fails to display any of the CSS styles or images. My admin site currently looks like:
(好吧,我本来应该包含一张图片,但堆栈溢出并没有让我这样做.我只想说它看起来像发布在此主题上的其他所有人的管理页面,请参阅 Apache 不提供 django 管理静态文件)
(well, I would have included an image but stack overflow didn't let me. Suffice to say it looks like the admin page of everyone else who's posted on this topic, see Apache not serving django admin static files )
我的登录页面和一些动态内容等应用程序工作正常,但是当我尝试提供静态内容时,我收到 403 错误.此外,当我尝试通过查看管理页面呈现的 html 并单击
Application pieces like my login page and some dynamic content work just fine, but when I try to serve static content, I get a 403 error. Additionally when I try to navigate to the stylesheet manually by looking at the admin page's rendered html and clicking on the link to the stylesheet at
http://localhost/static/admin/css/base.css
我收到 403 错误.我可以在终端中导航到那里,并更改文件夹的权限,以便 Apache 的 www-data 用户明确有权访问所有文件.
I get a 403 error. I can navigate there in a terminal, and changed the permissions for the folder so that Apache's www-data user explicitly has access to all the files.
这是我的 httpd.conf 的相关部分:
Here are the relevant pieces of my httpd.conf:
#AliasMatch ^/([^/]*.css) /usr/local/wsgi/static/styles/$1
Alias /media/ "/usr/local/wsgi/media/"
Alias /static/ "/usr/local/wsgi/static/"
<Directory "/usr/local/wsgi/static">
Order deny,allow
Allow from all
</Directory>
<Directory "/usr/local/wsgi/media">
Order deny,allow
Allow from all
</Directory>
WSGIScriptAlias / "/home/noah/Documents/Web/Basic/apache/django.wsgi"
<Directory "/usr/local/wsgi/scripts">
Order allow,deny
Allow from all
</Directory>
在朋友的建议下,我还将上述内容复制到了我的网站可用默认值:
On the advice of a friend I also copied the above to my sites-available default:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
TypesConfig /etc/mime.types
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/noah/Documents/Web/Basic/apache/ >
Options -Indexes FollowSymLinks
AllowOverride AuthConfig FileInfo
Order allow,deny
Allow from all
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
SetEnv DJANGO_SETTINGS_MODULE Basic.settings
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
#AliasMatch ^/([^/]*.css) /usr/local/wsgi/static/styles/$1
Alias /media "/usr/local/wsgi/media/"
Alias /static "/usr/local/wsgi/static/"
<Directory "/usr/local/wsgi/static">
Order deny,allow
Allow from all
</Directory>
<Directory "/usr/local/wsgi/media">
Order deny,allow
Allow from all
</Directory>
WSGIScriptAlias / "/home/noah/Documents/Web/Basic/apache/django.wsgi"
<Directory "/usr/local/wsgi/scripts">
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
这是我的 django.wsgi
Here is my django.wsgi
import os
import sys
path = '/home/noah/Documents/Web/Basic'
if path not in sys.path:
sys.path.append(path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'Basic.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
最后,这是我的 settings.py:
And finally, here is my settings.py:
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = '/usr/local/wsgi/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://localhost/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 = '/usr/local/wsgi/static/'
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = 'http://localhost/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 = 'bmc&epl=#u)r3elkvj#@90*cji*z^cg8dnh$7j9kh@g9wzw(ih'
# 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 = 'Basic.urls'
# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'Basic.wsgi.application'
我的 Django 项目 'Basic' 位于 ~/Documents/Web/中,符号链接到/var/www/
My Django project 'Basic' lives in ~/Documents/Web/ which is symlinked to /var/www/
非常感谢任何帮助,如果您需要更多文件/信息,请告诉我.
Any help is greatly appreciated, and let me know if you need any more files/information.
推荐答案
我也遇到过这个问题.
我无法按照 Noah 的建议将静态文件放在 /var/www
中.
i can't place the static files in /var/www
as Noah suggested.
通过添加到apache2.conf
解决:
<Directory /usr/local/django_apps/myapp/static>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
这篇关于为 Django 静态文件提供服务时的 Apache 403的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!