美文网首页
Django 开发时的静态文件配置参数以及 collectsta

Django 开发时的静态文件配置参数以及 collectsta

作者: Tim_Lee | 来源:发表于2017-07-18 09:54 被阅读0次

    1 概述

    通常生产情况下,Django 的项目文件与网站的静态文件是分开存放的,甚至可以存放在不同的服务器,比如 Django 的项目文件放在阿里云服务器,而同时把静态文件存放在七牛云。

    在每一个 Django 项目中的 settings.py 文件中,最下面的注释里面就有关于静态文件处理的官方文档网址。文档对 Django 如何处理静态文件有详细的介绍。

    Django 1.9.5 版本的 settings.py

    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/1.9/howto/static-files/
    

    Django 1.11 版本的 settings.py

    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/1.11/howto/static-files/
    

    2 主要流程

    对于 static 文件与 media 文件,本质是一样的,而且之前的 Django 版本是把这两种类型合并一起处理的。media 主要是针对用户上传的文件。static 是项目开发时,开发者提供的。

    • 设定好 MEDIA_URL/STATIC_URL, STATIC_ROOT/MEDIA_ROOT 以及 STATICFILES_DIRS 。
    • 使用 python manage.py collectstatic
    • media:用户上传时,会传到指定的 media_cdn 文件目录中。如果models 的 ImageField 设定 upload_to 属性,可以上传到指定目录中。
    • static:开发时,把静态文件都放在 STATICFILES_DIRS 中设定的 static 目录,运行 python manage.py collectstatic 会把 static 目录中的文件复制到 STATIC_ROOT 中设置的文件(static_cdn)。
    • 用户访问时,通过路由会指向相应的静态文件。

    3 相应的设置

    3.1 project/settings.py

    完整代码如下

    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static_cdn")
    
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "media_cdn")
    
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, "static"),
    ]
    
    STATICFILES_DIRS

    设置一个目录,用于存放开发时使用到的 static 文件。

    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, "static"),
    ]
    
    URL变量
    STATIC_URL = '/static/'
    MEDIA_URL = '/media/'
    

    URL:STATIC_URLMEDIA_URL 会引导请求去找对应的 URL。具体的 url 路由会在后面进行设置。

    ROOT变量

    注意 BASE_DIR 指的是 manage.py所在的目录。

    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    

    所以如果在 BASE_DIR 这个目录中设置文件夹,比如设置 templates 可以使用os.path.join(BASE_DIR, 'templates')

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates'),],
            # ...
        },
    ]
    

    但是如果要设置到 manage.py 所在目录外,另外一个平行同级目录。

    首先得到BASE_DIR 这个目录的上一级目录。

    os.path.dirname(BASE_DIR)
    

    在使用 os.path.join() 拼接得到与 BASE_DIR 平行的目录

    STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static_cdn")
    MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "media_cdn")
    

    得到的目录结构是

    .
    |-- media_cdn
    |   |-- car.jpg
    |   |-- landview.jpg
    |   `-- beach.jpg
    |-- README.md
    |-- requirements.txt
    |-- project
    |   |-- db.sqlite3
    |   |-- __init__.py
    |   |-- manage.py
    |   |-- posts
    |   |-- static
    |   |-- templates
    |   `-- project
    `-- static_cdn
        |-- admin
        |-- css
        `-- vendor
    

    3.2 project/urls.py

    在 urls.py 的文件中加入以下内容,这样就为 static 和 media 的ROOT目录设置好了路由。

    from django.conf import settings
    from django.conf.urls.static import static
    
    if settings.DEBUG:
        urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
        urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

    之所以做了一个判断if settings.DEBUG: ,是因为上线以后就不再使用这些 ROOT 目录。

    DEBUG 的状态是在 settings.py 中控制

    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    

    3.3 使用 collectstatic

    上面的参数设置好之后,就可以执行以下命令:

    $ python manage.py collectstatic
    

    相关文章

      网友评论

          本文标题:Django 开发时的静态文件配置参数以及 collectsta

          本文链接:https://www.haomeiwen.com/subject/cppckxtx.html