在 Debug模式下开发 Django 应用程序时,我使用以下代码提供静态文件:
if settings.DEBUG:
urlpatterns += patterns('',
(r'^m/(?P<path>.*)$', serve, {
'document_root' : os.path.join(os.path.dirname(__file__), "media")
})
)
我使用 nginx 作为前端,使用以下 nginx 配置在生产模式下为我的静态文件提供服务:
location m/
{
root /path/to/folder/media/;
}
这似乎不是最佳选择,因为我必须在媒体目录中创建一个“m”文件夹。我想知道其他人的 Django/nginx 配置文件是什么样的。具体来说,您能否剪切并粘贴 nginx.confg 和 urls.py 的部分(settings.DEBUG == True)
谢谢。
最佳答案
使用 Django 1.3 django.contrib.staticfiles
将负责在开发过程中为您提供一切服务。您不需要在 urls.py 中做任何特别的事情。在 Django 1.3 更新后,我为自己写了一个小指南,其中涵盖了要使用的设置:
# idiom to get path of project
import os
PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
# url prefix for user uploaded files, stuff that django has to serve directly
MEDIA_URL = '/media/'
# url prefix for static files like css, js, images
STATIC_URL = '/static/'
# url prefix for *static* /admin media
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'
# path to django-served media
MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media')
# path used for collectstatic, *where the webserver not django will expect to find files*
STATIC_ROOT = '/home/user/public_html/static'
# path to directories containing static files for django project, apps, etc, css/js
STATICFILES_DIRS = (
os.path.join(PROJECT_PATH, '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',
)
# Required for all the magic
INSTALLED_APPS = (
'django.contrib.staticfiles',
)
有关详细信息,请参阅文档:http://docs.djangoproject.com/en/1.3/howto/static-files/ .
我使用 nginx 和 uwsgi用于在生产环境中提供 django 应用程序(我使用 runserver 进行开发)。我将我的 /static
和 /media
文件夹(来 self 的 django 项目)符号链接(symbolic link)到 /var/www/vhosts/domain.com/html
中nginx 来找。您也可以使用 collectstatic
命令代替符号链接(symbolic link)。如果找不到静态文件,它会回退到 uwsgi(它正在运行 django 应用程序)。
您可以使用 fast-cgi 或 proxy_pass 或任何您想要的来代替 uwsgi。我更喜欢 uwsgi,因为它具有令人难以置信的功能和出色的性能。我将 uwsgi 作为守护进程运行:uwsgi --emperor '/srv/*/*.ini'
。这是一个相当新的选项,它告诉 uwsgi 扫描给定路径以查找配置文件。当 emperor uwsgi 守护进程找到一个配置文件时,它会使用找到的配置启动一个新的 uwsgi 实例。如果你改变你的配置,emperor uwsgi 守护进程会注意到并为你重启你的应用程序。您还可以像使用 mod_wsgi 一样触摸配置文件以重新加载,一旦您最初配置了所有内容,设置新应用程序真的很容易。
我遵循的路径约定是:
/srv/venv/ - virtualenv for project
/srv/venv/app.ini - configuration for uwsgi
/srv/venv/app.sock - uwsgi sock for django
/srv/venv/app.wsgi - wsgi file for uwsgi
/srv/venv/proj - django project
/srv/venv/proj/settings.py - project settings file
/srv/venv/proj/static - static files dir, linked into var/www/vhosts/domain.com/html
/srv/venv/proj/static/admin - admin static files, linked as well
/srv/venv/proj/media - media files dir
/var/www/vhosts/domain.com/html - base directory for nginx to serve static resources from
这是我的 nginx.conf:
location / {
root /var/www/vhosts/domain.com/html;
index index.html index.html;
error_page 404 403 = @uwsgi;
log_not_found off;
}
location @uwsgi {
internal;
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:/srv/venv/app.sock;
}
我的uwsgi ini文件(你也可以使用xml/yaml/etc):
[uwsgi]
home = /srv/%n
pp = /srv/%n
wsgi-file = /srv/%n/%n.wsgi
socket = /srv/%n/%n.sock
single-intepreter = true
master = true
processes = 2
logto = /srv/%n/%n.log
您还应该查看 gunicorn ,它具有非常好的 django 集成和良好的性能。
关于python - 在 Django 的调试和生产中配置静态文件的最常见方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5906197/