目录

  • Django学习之十: staticfile 静态文件

    • 理解阐述
    • 静态文件
    • Django对静态文件的处理
    • 其它方面
    • 总结

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这组成部分:如:https://www.myapptest.cn/project/static/school_courses/images/001.jpg 分为:
    第一部分"https://www.myapptest.cn/project/static/"
    第二部分"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_URL使用的一个小误区

由于django开发环境中,使用了django.contrib.statifiles 组件,且开启DEBUG模式后,对于静态文件的请求会自动在url_parttens追加一条静态文件访问的路由,源码如下:

# staticfiles.urls
from django.conf import settings
from django.conf.urls.static import static
from django.contrib.staticfiles.views import serveurlpatterns = []
def staticfiles_urlpatterns(prefix=None):   """    Helper function to return a URL pattern for serving static files.    """  if prefix is None:prefix = settings.STATIC_URLreturn static(prefix, view=serve)# Only append if urlpatterns are empty
if settings.DEBUG and not urlpatterns:urlpatterns += staticfiles_urlpatterns()

这条路由会将STATIC_URL作为前缀,而static(prefix, view=server)源码如下:

def static(prefix, view=serve, **kwargs):"""Return a URL pattern for serving files in debug mode.from django.conf import settingsfrom django.conf.urls.static import staticurlpatterns = [# ... the rest of your URLconf goes here ...] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)"""if not prefix:raise ImproperlyConfigured("Empty static prefix not permitted")elif not settings.DEBUG or '://' in prefix:  # 这里对于有://不会添加静态路由# No-op if not in debug mode or a non-local prefix.return []return [re_path(r'^%s(?P<path>.*)$' % re.escape(prefix.lstrip('/')), view, kwargs=kwargs),]

注意在elif判断位置,如果prefix前缀中有:// 字符那么这条路由将不会添加。

得出的结论就是:在django开发环境中,如果在STATIC_URL中使用了完整的URL,如"http://127.0.0.1:8000/static/", 由于其中有了://字符,默认静态路由是不会添加到url_parttens列表当中。我们之所以要用完整路由,是因为在开发restful接口时,前后端是跨域的,需要提供完整url才行。但是使用完整url在django开发环境下是无效的,所以最好api接口将ip和port单独返回给前端,让前端来做完整url的拼接。解决办法:前端就需要修改代码来拼接完整url,api接口设计上要提供主机的ip和port信息给前端。对于生产环境,就不存在这个问题,因为web server是懂的url意义的。但是在生产环境还是推荐前端拼接方案,这样更易于应用的移植。

STATICFILES_DIRS 给django设置额外的静态文件存放处。

我们都知道django开发环境下,是通过serve和finder来查找静态文件的,而默认查找都是从应用的static文件夹下查找,也就是默认我们要把静态文件都放到app应用下的static子目录下。要是我们又项目全局的静态文件呢?这时候就需要设置一个额外的静态文件存放路径,在django的settings中设置STATICFILES_DIRS,这是一个list列表,列表中可以设置多个静态文件的存放路径,路径必须是文件系统的绝对路径字符串。可以根据settings.py所在路径进行构建。如:
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
一般我们都是在项目下的static目录存放项目全局静态文件。

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. 开发中文件夹错乱分布的静态文件,要有同一个逻辑相对路径,且不能动了第二部分相对路径的结构。这才是每一个框架都遵循的模式。才有开发环境 部署到 线上环境的一致性。

转载于:https://www.cnblogs.com/ZJiQi/p/10234347.html

Django学习之十: staticfile 静态文件相关推荐

  1. python学习[第十四篇] 文件的输入与输出

    python学习[第十四篇] 文件的输入与输出 标准文件类型 一般来说只要程序一执行,就会访问3个文件: 标准输入(键盘) stdin 标准输出(显示器缓冲区) stdout 默认输出到屏幕 标准错误 ...

  2. django 1.3下关于静态文件staticfiles的设置

    Django 1.3版本发布有些日子了,在站点被屏蔽的这段时间里学习也处于荒废状态,因此到今天才真正接触到新版下Static文件的处理设置,希望不算太晚. 更改设置涉及的文件: settings.py ...

  3. Django模板、配置文件、静态文件及案例实现(创建模板、设置模板查找路径、模板接收视图传入的数据、模板处理数据、BASE_DIR、DEBUG、本地语言与时区、App应用配置)

    1.Django模板 网站如何向客户端返回一个漂亮的页面呢? 漂亮的页面需要html.css.js. 可以把这一堆字段串全都写到视图中, 作为HttpResponse()的参数,响应给客户端. 存在的 ...

  4. 设置Django关闭Debug后的静态文件路由

    Django在Debug模式关闭掉后请求静态文件时,返回404相应码,后台的请求url是"GET /static/css/404.css HTTP/1.1" 404 1217,找不 ...

  5. 使用Python Django开发web应用14 静态文件

    版本声明:转载请注明出处.未经允许,禁止商业用途. 14 使用Python Django开发web应用 静态文件 讲师:刘一凡 第一步: 准备静态文件,制作图片OurBlog 第二步: 缺省配置下.静 ...

  6. springMVC3学习(四)--訪问静态文件如js,jpg,css

    假设你的DispatcherServlet拦截的是*.do这种URL.就不存在訪问不到静态资源的问题 假设你的DispatcherServlet拦截了"/"全部的请求,那同一时候对 ...

  7. C语言学习第十五课(文件操作)

    第十五课 1,文件的概念 文件一般指存储在外部介质(如磁盘磁带)上的集合: 2,流的概念 ·操作系统是以文件为单位对数据进行管理的,输入输出是数据传送的过程,数据如流水一般从一处流向另一处,因此将输入 ...

  8. Go语言学习笔记(十八)之文件读写

    25.文件读写 1.文件打开和读 A.文件分类:文本和二进制文件 B.文件存取方式:随机存取和顺序存取 文件打开代码示例: 1: package main 2: 3: import ( 4: &quo ...

  9. MonoRail学习笔记十五:文件上传

    在MonoRail中文件上传很简单,使用智能绑定方式后直接用HttpPostedFile类就可以进行操作了 vm文件: 1<h1 align="center">Uplo ...

最新文章

  1. 解决Vue刷新一瞬间出现样式未加载完或者出现Vue代码问题
  2. java 滚动条 滚动_广告条随滚动条的移动而移动
  3. mybatis做批量删除时写SQL语句时遇到的问题
  4. html弧形列表效果,web前端入门到实战:html5网页特效-弧形菜单
  5. app应用内嵌h5页面怎么直接打开safari_localstroage过多存储满的情况下应该怎么办?...
  6. autoitv3点击windows界面
  7. PHP EOF(heredoc)的使用方法
  8. JAVA day06 继承,super,方法的重写,抽象类
  9. Learning Video Object Segmentation from Static Images
  10. 解决Android Studio出现Failed to open zip file. Gradle's dependency cache may be corrupt的问题
  11. Metasplotable3 简易安装教程
  12. java 命令行工具_分享java自带命令行工具jmap、jhat与jinfo的方法详解
  13. unknownhostexception错误解决方案
  14. Electronic Commerce 12th Gary Schneider
  15. 凤凰卫视:专业、互动、持续的云服务助力凤凰新媒体转型
  16. Windows系统必备的软件
  17. 第二十章:因特网协议第四版(IPv4):转发和本地传递
  18. ddtv.space index.php,图解MongoDB原理(二)
  19. 基于Sentence-Bert的检索式问答系统
  20. 安其拉开门最快的服务器,魔兽世界:怀旧服安其拉开门压力测试周四开放,位面已成最大问题...

热门文章

  1. (六)使用ResNet50迁移学习进行COVID-19诊断:从头开始构建深度学习网络
  2. 使用数组操作解码YOLO Core ML对象检测(三)
  3. 微软 Powertoys 推出新的实用程序,自定义键盘快捷管理
  4. Windows Terminal v0.7 发布:支持分屏、重排选项卡和改进 UI
  5. Bare HTTP不完全是RESTful
  6. 全世界到底有多少软件开发人员?
  7. chart.js雷达图不显示刻度标签_Matplotlib从入门再也不放弃
  8. activiti 流程文件存哪里_JAVA-工作流引擎-activiti-Tasks介绍
  9. osip和mysql_Windows下编译eXosip、osip,以及UAC和UAS的例子
  10. asp.net oracle连接数据库,ASP.NET连接Oracle数据库的步骤详解