Django 教程之media和static静态文件

区别

Django有两种静态文件:

  • static 称为静态文件夹,是不变的,形成网站的核心部件,如 CSS文件,JS文件,背景图片等;可为Templates模板提供支持
  • media 称为媒体文件夹,是变动的,由用户定义的文件,如 用户头像, 用户上传的图片或视频等;可为富文本编辑器mdeditor提供支持

配置说明

我要做的是个人博客,不提供其他人注册登录功能,故media只是为了存放文章的封面、图片等信息。

故在目录方面,我的设置如下:

  1. static目录与Templates目录放在一起,由“主题目录接管”
  2. 主题目录:与manage.py同级目录下创建templates目录,目录下创建主题文件夹,如default,里面创建templates和static静态文件夹
  3. 如果想更换主题,只需创建新主题文件夹,变动templates和static即可
  4. media目录放在根目录,毕竟我的“主题”无论怎么换,博客文章内容不会换,涉及的本地图片不会变动

配置static目录

https://docs.djangoproject.com/en/1.11/howto/static-files/

Django的静态文件处理一般分debug模式和非debug模式

  • debug模式的情况下允许访问静态资源,无需STATIC_ROOT
  • 非debug模式也就是生产模式,在服务器运行时, 静态资源需要使用nginx或者apache之类的工具维护

简单说下:

  • STATIC_URL - 可以理解为通过url访问static文件的路径,

    如 项目路径是,{{projectName}}/static/common_static/test.css

    ​ 则访问url是: http://IP/static/common_static/test.css

  • STATIC_ROOT - 可以理解为你打算在服务器上存储static文件的路径(通过 python manage.py collectstatic命令),collectstatic命令后将复制静态文件到STATIC_ROOT指定的目录中, 部署django项目的时候需要

  • STATICFILES_DIRS - 可以理解为配置Django寻找静态文件时首先去STATICFILES_DIRS里面寻找, 其次再到各个app的static文件夹里面找,Django查找静态文件是惰性查找,查找到第一个,就停止查找了

    django放置静态文件有两种方式,一是在每个app里新建一个static目录,将静态文件放置其中;另一种是对公共文件的处理,如jQuery bootstrap等,这时就需要配置 STATICFILES_DIRS。

配置方法:

  1. 确定主题目录`/templates/default/,创建static文件夹

  2. debug模式在settings中进行设置

    # 对外提供WEB访问时的URL地址
    STATIC_URL = '/static/'
    # 开发阶段放置项目自己的静态文件,不能包含STATIC_ROOT路径
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'templates', THEME, 'static'),
    ]
    
  3. 非debug模式在settings中进行设置,需要修改

    在`settings.py`同级的`urls.py`内还需要把`STATIC_URL`和django的url连接起来
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns
    urlpatterns += staticfiles_urlpatterns()
    
    STATIC_URL = '/static/'
    
    # 执行collectstatic命令后会将项目中的静态文件(包括STATICFILES_DIRS、自带admin的静态文件)收集到该目录下面来(所以不应该在该目录下面放置自己的一些静态文件,因为会覆盖掉)
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, 'collect_static'),
    )
    
  4. 模板中使用静态文件,load static

    {%load static%}和{%load staticfiles%}:哪个是首选?

    https://stackoverflow.com/questions/34422971/load-static-and-load-staticfiles-which-is-preferred

    {% load static %}
    
    <img src="{% static "my_app/example.jpg" %}" alt="My image"/>
    
  5. 模板中使用静态文件,无需load static,配置全局使用load static

    TEMPLATES加入'builtins': ['django.templatetags.static']

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates', THEME, 'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            'builtins': ['django.templatetags.static']
            },
        },
    ]
    

    使用,无需{% load static %},html中直接使用

    <script src="{% static 'js_dist/jquery.min.js' %}"></script>
    

不能确实是不是需要引入这个需要修改

# from django.templatetags import static
        ``# 在模板中设置 static 后,以后在页面中使用
        ``# static 就不需要每个页面都使用 {% load static %}加

配置media目录

简单说下:

  • MEDIA_ROOT - 设置用户上传文件的实际保存目录,该文件夹自动创建

  • MEDIA_URL - 代表用户通过URL来访问这个本地地址的URL

    如 本机MEDIA_URL 为”/media/”则访问url是: http://IP/media/***

配置方法:

  1. settings.py进行设置

    MEDIA_URL='/media/'
    MEDIA_ROOT=os.path.join(BASE_DIR,"media")
    
  2. urls.py路由设置

    from django.conf import settings         # 导入项目文件夹中settings.py模块
                                             # 或者 from . import settings
    from django.views.static import serve    # 导入相关静态文件处理的views控制包
    
    urlpatterns = [
        url('media/(?P<path>.*)$', serve, {'document_root': MEDIA_ROOT}),
    ]
    
  3. models.py模板设置

    FileFieldImageField字段适用于存储文件/图片,出于性能考虑,文件并不直接保存到数据库,而是保存在文件系统里,因此该字段只是记录一个路径而已。

    img_link = models.ImageField(upload_to='images/%Y-%m', max_length=255,
                                     help_text='提示:不添加封面可以不选择图片,默认没有图片',
                                     blank=True, null=True, verbose_name='文章封面')
                                     
    upload_to相当于上传到/media/images目录下,格式为year-month,如2019-10
    
    
    avatar = models.FileField(verbose_name='头像', upload_to='upload/avatar/')
    
    upload_to相当于上传到/media/upload/avatar/目录下
    
  4. 模板HTML中引用路径

    • 方式一

      <img src="/media/{{ article.img_link }}">
      
    • 方式二

      <img src="{{ article.img_link.url }}">
      

当前不知道以下设置的用途,用到再说:

  1. TEMPLATES设置中的context_processor选项中加入:‘django.template.context_processors.media’, 据说是为了在html中引用{{ media_url }},会把media_url 注册到HTML

  2. 将media也加入静态文件目录列表中,STATICFILES_DIRS = [ os.path.join(BASE_DIR, ‘static’), os.path.join(BASE_DIR, ‘media’), ]

  3. mdeditor貌似用到了。

在文件最后加上: +static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

即 urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Django中,可以通过表单来实现文件上传功能。当用户提交包含文件的表单时,Django会将文件写入一个临时文件,存储在系统的临时目录中。对于较大的文件,你可以观察到文件大小的增长,因为Django会将数据写入磁盘。\[1\] 如果你需要Django中实现文件下载功能,有几种方法可以实现。最简单的方式是将静态文件交给Nginx等处理。但是,有些情况下,由于网站本身的逻辑,需要通过Django提供下载功能,例如页面数据导出功能或先检查用户权限下载文件等。在这种情况下,你可以研究一下在Django中实现文件下载功能的方法。\[2\] 要在Django中实现文件上传功能,你可以按照以下步骤进行操作: 1. 在主路由中添加路由,导入必要的模块: ``` from django.conf import settings from django.conf.urls.static import static ``` 2. 将以下代码添加到路由列表中: ``` urlpatterns = \[ ... \] urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ``` 这样,你就可以在Django中使用表单来上传文件了。\[3\] #### 引用[.reference_title] - *1* *2* [django 的上传文件操作](https://blog.csdn.net/zhanghs1989/article/details/123924347)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Django - 文件上传](https://blog.csdn.net/pipi_peng/article/details/117399405)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值