返回顶部
首页 > 资讯 > 后端开发 > Python >Django学习之十: staticfi
  • 351
分享到

Django学习之十: staticfi

Djangostaticfi 2023-01-30 23:01:31 351人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录 Django学习之十: staticfile 静态文件 理解阐述 静态文件 DjanGo对静态文件的处理 其它方

目录

  • Django学习之十: staticfile 静态文件
    • 理解阐述
    • 静态文件
    • DjanGo对静态文件的处理
    • 其它方面
    • 总结

Django学习之十: staticfile 静态文件

理解阐述

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

静态文件

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

静态文件在服务端的存放

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

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

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

Django对静态文件的处理

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

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

  • 首先要分解url这组成部分:如:/file/imgs/upload/202301/30/pjkgogefygy.jpg 分为:
    第一部分"/file/imgs/upload/202301/30/y2vz45baaki.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 serve

urlpatterns = []
def staticfiles_urlpatterns(prefix=None):   
    """    Helper function to return a URL pattern for serving static files.    """  
    if prefix is None:
        prefix = settings.STATIC_URL
    return 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 settings
    from django.conf.urls.static import static

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

--结束END--

本文标题: Django学习之十: staticfi

本文链接: https://lsjlt.com/news/180753.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Django学习之十: staticfi
    目录 Django学习之十: staticfile 静态文件 理解阐述 静态文件 Django对静态文件的处理 其它方...
    99+
    2023-01-30
    Django staticfi
  • Django学习之十一:真正理解Djan
    目录 URL Dispatcher 简介 模式概念 对比URLPattern 与 URLResolver (多态的体现) ...
    99+
    2023-01-30
    Django Djan
  • Python学习之旅(十)
    字符串格式化有2种方法:一是用“%”,二是用format。 转换标志:,默认右对齐,%后面加上“-”表示左对齐;“+”表示在转换值之前要加上正负号;“ ”(空白符)表示在正数前面保留空格;“0”表示转换值若位数不够用0填充。 最小字段宽...
    99+
    2023-01-30
    之旅 Python
  • Django学习之十三:提高页面开发效率
    目录 Django 模板 模板语法 逻辑语法 函数式过滤器 内置filter 功能tag ...
    99+
    2023-01-31
    效率 页面 Django
  • Python学习之旅(十一)
    一、全局变量和局部变量 局部变量:在函数内定义的变量,在函数内使用 全局变量:在函数外定义的变量,在程序任何地方都可以使用 1、全局变量与局部变量同名 这时函数内部只调用局部变量,如果要调用全局变量需要在函数内加一句“global 同名...
    99+
    2023-01-30
    之旅 Python
  • python学习之旅(十五)
    一、装饰器 decorator:本质上就是函数,可以增强函数的功能。 定义起来虽然有点复杂,但使用起来非常灵活和方便 1、不修改被装饰函数的源代码 2、不修改被装饰函数的调用方式 3、装饰函数对被装饰函数透明 import funct...
    99+
    2023-01-30
    之旅 python 十五
  • Python学习之旅(十四)
    Python内置函数 1、abs:取绝对值 abs(-1) 1 2、all:把序列中的每一个元素拿出来做布尔运算,都为真则返回True,如果序列中有None、0、“”、[]、{}、()则返回False all([1,23,0]) ...
    99+
    2023-01-30
    之旅 Python 十四
  • python学习之旅(十六)
    1、可以把模块想象成导入Python以增强其功能的扩展 2、任何程序都可以作为模块导入 3、导入模块并不意味着在导入的时候执行某些操作,它们主要用于定义变量、函数和类等   #hello1.py def hello(): pr...
    99+
    2023-01-30
    之旅 python 十六
  • Python django学习之:mod
    1. 建立app在自己的工程项目目录下输入:python manage.py startapp myapp(你想建立的app名称)建立一个叫myapp的app这样,在你的工程项目目录下会出现一个叫myapp的目录2. 创建Model在app...
    99+
    2023-01-31
    Python django mod
  • Python学习之旅(二十五)
    正则表达式:检查一个字符串是否与某个模式匹配 \d :匹配数字 \w :匹配字母或数字 . :匹配任意字符 {n} :匹配n个字符 {m,n} :匹配m到n个字符 \s :匹配空格 a|b :匹配a或b ^ :匹配字符串开头 $ :匹配...
    99+
    2023-01-30
    之旅 二十五 Python
  • Python学习之旅(二十四)
    一、threadlocal 在多线程环境下,每个线程都有自己的数据 一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁 在函数间一层层调用的时候,使用局部变量很麻烦,使...
    99+
    2023-01-30
    之旅 二十四 Python
  • Python学习之旅(二十九)
    一、Pillow PIL(Python Imaging Library):提供了强大的图像操作功能,可以通过简单的代码完成复杂的图像处理,是Python平台事实上的图像处理库,支持Python 2.7以及更低的版本 Pillow:在PI...
    99+
    2023-01-30
    之旅 二十九 Python
  • Python学习之旅(三十三)
    网络通信是两台计算机上的两个进程之间的通信,而网络编程就是如何在程序中实现两台计算机的通信 P协议负责把数据从一台计算机通过网络发送到另一台计算机 TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据...
    99+
    2023-01-30
    之旅 Python 三十三
  • Python学习之旅(三十二)
    Python内置了turtle库,可以在计算机上绘图 运动控制: 1、画笔定位到坐标(x,y):turtle.goto(x,y) 2、向正方向运动 distance 长的距离:turtle.forward(distance) 3、向负方...
    99+
    2023-01-30
    之旅 Python 三十二
  • Python学习之旅(三十四)
    UDP编程 相对TCP,UDP则是面向无连接的协议 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包 虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用...
    99+
    2023-01-30
    之旅 Python 三十四
  • Python学习之旅(三十七)
    程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上,无论是保存到本地磁盘,还是通过网络保存到服务器上,最终都会将数据写入磁盘文件。 而如何定义数据的存储格式就是一个大问题。 为了便于程序保存和读取数据,而...
    99+
    2023-01-30
    之旅 Python 三十七
  • Python学习之旅(三十八)
    二、MySQL MySQL是Web世界中使用最广泛的数据库服务器。SQLite的特点是轻量级、可嵌入,但不能承受高并发访问,适合桌面和移动应用。而MySQL是为服务器端设计的数据库,能承受高并发访问,同时占用的内存也远远大于SQLite...
    99+
    2023-01-30
    之旅 Python 三十八
  • Django学习之配置篇
    MTV Model Template View 数据库 模版文件 业务处理 了解Django框架,功能齐全 一.安装Django&Django基本配置 安装Django pip3 django 配置Django 1.配置Dja...
    99+
    2023-01-30
    Django
  • Oracle学习之DATAGUARD(十一) snapshot database
       Snapshot Standby,此功能可将备库置身于"可读写状态"用于不方便在生产环境主库中测试的内容,比如模拟上线测试等任务。当备库读写状态下任务完成后,可以非常轻松的完成S...
    99+
    2024-04-02
  • Oracle 学习之RMAN(十)RMAN维护
      我们前面做了那么多的备份,我如何能通过RMAN查询到我所做过的操作呢?RMAN为我们提供了LIST命令。LIST命令可以显示备份集、代理copy、镜像copy的信息。RMAN> ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作