欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django学习之十: staticfile 静态文件

程序员文章站 2023-02-11 08:00:49
Django学习之十: staticfile 静态文件 [TOC] 理解阐述           静态文件在web开发中是肯定经常要用到的,所以要把静态文件弄懂弄清楚,一次搞懂了就不用以后在各种框架中提到静态文件,就要重 ......

目录

django学习之十: staticfile 静态文件

理解阐述

          静态文件在web开发中是肯定经常要用到的,所以要把静态文件弄懂弄清楚,一次搞懂了就不用以后在各种框架中提到静态文件,就要重新学习一次,毕竟静态文件都是相同的特性,没什么大的变化,就用一个模式思想去套框架对应的设置就行了。
          同时,将静态文件访问处理从复杂视图逻辑中剥离出来,也是一种解耦,复杂视图只需要知道静态文件的访问地址就可以了,不需要将复杂视图响应中加上静态文件的内容返回给用户,而只需要给用户返回一个静态文件的url即可,用户端再发起一次静态文件请求就可以了,而处理静态文件请求的模式就简单多了,各种web server天生就能处理静态文件和页面。
特别是开发时,使用如django框架开发(脚手架)环境处理静态文件访问和生产环境对静态文件的访问处理是不同的,django开发环境由于不是web server 所以将静态文件的处理也放入了简单视图逻辑中。这也是为什么django项目到开发环境需要做一些部署步骤,具体下面会说怎么操作。

静态文件

         开发中经常说道的静态文件就是:图片,javascript,css, 提供下载的二进制程序等,这些静态文件的访问很简单,就是把文件传送给请求方即可,所以静态文件的访问请求,不需要后端逻辑处理,只需要将文件内容放入响应体中,由web server提供响应头等其它部分。

静态文件在服务端的存放

通常在web server 将静态文件放入 web server 的文档document root 目录下就行。根据web server 配置中设置的路径前缀与实际document path结合,就可以通过url获取到静态文件了。

这种部署静态文件,是纯粹的单单部署静态文件,没有和动态页面结合起来。

因为动态页面的视图代码中要使用到静态文件的访问的url,还有就是如django框架,每个app目录下创建了属于app的静态文件存放目录。所以代码中怎么填写正确的url将框架中的静态文件处理得统一组织,利于部署,就是框架需要解决的问题。以django处理为例。

django对静态文件的处理

jango中需要使用静态文件的url

主要还是在django的模版中使用,怎么使用?

  • 首先要分解url这组成部分:如: 分为:
    第一部分""
    第二部分"school_courses/images/001.jpg"

  • 第一部分,是我们访问静态文件的url前缀,这个是根据实际业务动态可变的。 涉及到的django settings.py中配置 static_url为该值web server 将 该url指向 static_root 路径。这里就出现一个问题,是先有url还是先有web server的指向。如果是django代码与静态使用同一个web server,那么可以先有url,再设置 web server 将 url 指向 static_root路径。如果是静态放在云或者历史已经使用的url,那么先以提供的url和指定路径进行配置static_root 和 static_url。
  • 第二部分,静态文件的相对路径。 这个相对路径分用于开发环境用于web server线上环境代码中使用查找是不同的,根据两种场景进行分析
    ,所以这个是非常重要的,要理解好:
    1. 在django开发环境中,开发环境django给我们提供了finder静态文件查找器和django.contrib.statifiles.views.serve视图函数。所以django代码中(主要还是template中),我们只要提供第一部分和第二部分完整路径(使用static tag 可以不提供第一部分只提供第二部分,static会根据 static_url 设置的拼凑完整路径)。当完整路径的请求到达了django开发环境,剔除第一部分,将第二部分提供给serve视图和finder,然后根据查找器封装的逻辑,找到对应的静态文件。
    2. 而在web server 线上环境中, 没有了django的 finder 和 serve视图。此时django代码端使用url还是完整第一部分加第二部分的,是没有变化的。当静态请求达到web server后,也是根据 web server 将 该url指向 static_root 路径 配置,提出第一部分,第二部分用于到 static_root路径查找匹配的路径文件了。

小结:
开发环境和 web server 环境, 关联就是 static_url, static_root。模版中最好使用static tag灵活点。
而 staticfiles_finders 是和开发环境有关;staticfiles_dirs 和 collectstatic命令有关;staticfiles_storage就更高级了查看官网吧,很少用到。

django中查找静态文件得利用‘django.contrib.staticfiles' 这个内置app,必须注册到配置文件installed_apps列表中。因为该app提供了查找文件的finder api。finder 查找静态文件的逻辑是封装了的。

django将静态文件统一组织

就是 根据 static_root 路径,将所有app中static目录和 staticfiles_dirs中路径的静态文件部署到 static_root指定的路径中。

对于每个app的static,django提倡 app namespace,避免统一组织时的同名静态文件冲突。所谓app namespace,就是在static下再创建一个与app名称相同的文件夹,将静态文件都放入这个子文件夹中。

其它方面

django动态查找静态文件的finder

  • appdirectoriesfinder 是默认的一个finder。这个finder查找静态文件的方式是,在注册了的app中的static子目录中去查找与请求文件路径相同的静态文件。这也是为什么我们在创建app后要在其中创建一个static目录的原因。而且为了避免文件名相同,要求在static中再创建一个和app名相同的目录,将静态文件都放在其中,以此来用应用名区分静态文件。

django开发中关闭静态文件服务方式

  • 可以settings.py中 debug设置为false。
  • 或者将django.contrib.staticfiles 从installed_apps中注释掉。

django开发环境到生产环境步骤

  1. 设置好要使用的相对url路径,即配置文件中的static_url。
  2. 设置好static_root,用于集中存放静态文件的相对实际路径
  3. 在http web server 中 配置 相对url路径与相对实际路径的映射。

总结

  1. 静态文件url 规划好 url 与 对应的实际路径。即static_url 和 static_root
  2. 开发环境依赖static_url。线上环境依赖static_url和static_root两者,即两者的映射配置。代码中依赖static_url,用于static 模版标签去组装出完整的静态文件url。
  3. 对于static_url,如果视图和静态文件都在同一个server,那不必提供主机host和端口por
    t信息,只需要端口以后的信息就可以了。但是如果静态文件在其它服务器,那就要提供完整的包括主机和端口信息的url了。
  4. 开发中文件夹错乱分布的静态文件,要有同一个逻辑相对路径,且不能动了第二部分相对路径的结构。这才是每一个框架都遵循的模式。才有开发环境 部署到 线上环境的一致性。