python - 在 Django 的调试和生产中配置静态文件的最常见方法是什么

标签 python django nginx

在 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/

相关文章:

python - 如何解决: lto1: fatal error: bytecode stream in file '...' generated with LTO version 6. 0而不是预期的7.1

python - 如何在 Django 中实现单例

nginx - 在 Kubernetes ingress Nginx 中编辑 max_conns?

php - php yii2 的访问日志系统?

python - 尝试 - 除了 python

python - 在直方图中记录计数值,而不是轴本身

python - 如何为 tensorflow 多GPU代码实现批量归一化层

django - 如何在django中切换L10N

python - 将 Django Rest Framework 与序列化程序一起使用时出现 AttributeError

http - 使用 Nginx Lua 模块写入文件