APP下载

Django静态文件管理机制及最佳使用策略研究

2023-11-14贾文雅尹雪婷白艳明张亮明

现代计算机 2023年17期
关键词:文件夹静态代码

王 祎,贾文雅,尹雪婷,白艳明,张亮明

(1.山西药科职业学院工商管理系,太原 030031;2.山西药科职业学院器械工程系,太原 030031;3.山西药科职业学院电教中心,太原 030031)

0 引言

Django 是一个广受欢迎的Web 框架,用于开发现代的Web 应用程序。它为开发者提供了许多有用的功能,包括静态文件管理。虽然静态文件管理是一项相对简单的任务,但如果不理解Django 的静态文件管理机制,可能会导致在使用静态文件时遇到各种问题。本文将结合项目开发实践及相关文档研究,对Django 的静态文件管理机制进行深入解析,以帮助开发者更好地使用静态文件,并在此基础上提出了一种Django 静态文件的使用策略,实现开发状态和部署状态的自由切换。

1 Django静态文件管理机制概述

Django 在开发状态(DEBUG=True)和部署状态(DEBUG=False)下对静态文件的处理方式有所不同。在开发状态下,Django 使用django.contrib.staticfiles 进行静态文件管理,静态文件可以存放在应用的static 子目录中,也可以存放在STATICFILES_DIRS 指定的目录中,Django 会自动扫描并管理这些目录中的文件。

而在部署状态下,所有的静态文件都需要放置到一个单独的目录中,再由专业的静态文件服务器进行管理。开发者需要使用命令将开发状态下的所有静态文件收集到该文件夹中,并提供正确的静态文件路径给专业的服务器,以便服务器能够正确地找到并管理这些文件[1]。

2 Django使用静态文件的一般方式

一般来讲,在使用Django 框架建立网站时,可以通过以下步骤来设置使用静态文件[2]。

第一步:启用django.contrib.staticfiles

在项目的settings.py文件中找到INSTALLED_APPS 设置项,保持其原有内容不变,在列表的最后加入‘django.contrib.staticfiles’,代码如下:

一般在创建项目时默认已加入该项,所以通常不需要修改。

第二步:设置访问静态文件时使用的基础URL

在项目的settings.py 文件中找到STATIC_URL(若找不到,则新建一个),将其值设置为‘/staticFiles/’,代码如下:

其中的‘/staticFiles/’可以修改为你想要使用的任何字符串,最后一个字符必须是斜线‘/’。

第三步:在应用文件夹下建立static文件夹

每一个项目通常都会有多个应用,假设在项目中存在一个名为myapp1 的应用,要实现该应用静态文件的正确引用,需要在myapp1 目录下建立static 文件夹,这个文件夹的名称不可以更改,因为这是Django 默认查找的目录。静态文件需要存放在该static 文件夹下。该文件夹下还可以建立子文件夹。

第四步:使用static标签引用静态文件

在应用的模板文件中,首先使用{% load static %}导入static 标签,然后通过{% static“静态文件相对路径”%}就可以访问到需要的静态文件。

3 应用举例

下面以图片为例,演示静态文件的使用。假设有一个名称为myWebSite 的Django 项目,该项目有两个应用myapp1 和myapp2。要实现图片的正确引用,需要完成以下四个步骤:

第一步:修改项目的设置,编辑myWeb-Site/settings.py文件,在其中加入如下代码:

这一步中除‘django.contrib.staticfiles’之外,‘myapp1’‘myapp2’也不可少,只有在这里声明了应用名称,Django 才会到它们的目录下去寻找static文件夹。

第二步:编辑myWebSite/settings.py 文件,在其中加入如下代码:

这一步设定了访问静态文件的基础URL。

第三步:在应用文件夹下建立static 文件夹。建好之后的目录结构如图1 所示(隐藏了与静态文件引用无关的内容)。

图1 目录结构示例1

在myapp1 中有一张图片‘钱学森.jpg’,存放位置是myWebSite/myapp1/static。为了能正常访问这张图片,static 文件夹必须要在应用目录myapp1 之下,且名称必须是static。类似的,myapp2要用到的静态文件,需要放置到myWeb-Site/myapp2/static 文件夹之下。若有其它应用,与此类似。

第四步:在模板文件中引用‘钱学森.jpg’,可以通过以下代码实现:

其中static 标签对应的是STATIC_URL 的值,{%static“钱学森.jpg”%} 对应的URL是:‘/static-Files/钱学森.jpg’,在模板中直接使用该地址也可以访问到图片文件。

Django 将每个应用的static 文件夹下的所有内容都对应到了‘/staticFiles/’这个URL 之下。若以‘python manage.py runserver 127.0.0.1:8000’启动网站,则在浏览器中可以通过‘http://127.0.0.1:8000/staticFiles/钱学森.jpg’来访问该图片文件。

4 可能遇到的问题和使用技巧

(1)不使用{%load static%}能否引用图片?

不使用{% load static %}也能引用图片,方法如下[3]:

修改settings.py 文件,在其中加入如下代码,原有代码保持不变:

以上设置完成之后重启网站,就可以通过{{STATIC_URL}}来引用STATIC_URL 中的值。在模板中构建静态文件地址的代码为:‘{{STATIC_URL}}钱学森.jpg’,其对应的URL为‘/static_url/钱学森.jpg’。

(2)在项目中存在多个应用的时候,有些应用的静态文件可能会使用相同的名称,同名静态文件在引用时出现冲突怎么办?

是的,同名静态文件确实会存在冲突。Django 在查找静态文件时,以先找到者为准,所以如果存在同名文件,返回的地址对应的是首先找到的文件,可能导致文件引用错误。

为了解决这个问题,一般采用的方法是,在每个应用的static 文件夹下再以应用名称建立一个文件夹,该应用的所有的静态文件都存放在该文件夹下,为了便于使用,一般会以js、css、imgs 等文件夹来区分静态文件的类型,目录结构如图2所示。

图2 目录结构示例2

如图2 所示,在myapp1/static 文件夹下再建立一个myapp1 文件夹,在myapp2/static 文件夹之下再建立一个myapp2 文件夹。这样在引用myapp1 中的静态文件‘钱学森.jpg’时,其引用地址是:

而在应用myapp2 中存在的同名文件,其引用地址是:

如此一来,就不会出现地址冲突的问题了。

(3)有一些静态文件在很多应用中都会用到,放到某一个应用的static 文件夹下好像不太合适,该怎么办?

可以使用公共静态文件夹,将公用文件存放在该文件夹下。公共静态文件夹可以通过STATICFILES_DIRS 进行设定。编辑settings.py文件中,增加如下代码:

STATICFILES_DIRS=(‘common_static’,)

将公共静态文件存放到‘common_static’文件夹下即可。这里指定的文件夹可以使用绝对地址,也可以使用相对地址,相对地址是相对项目主目录的地址。上面的代码设置的就是一个相对地址。这里可以指定多个文件夹,文件夹名称可以由用户自行设定。这里的文件夹可以位于项目文件夹之外。绝对地址一般使用os. path. join(BASE_DIR,‘common_static’)这样的方式来生成,避免硬编码,具有更高的可移植性。Django 查找文件的顺序是先查找STATICFILES_DIRS 中指定的文件夹,后查找应用下的static文件夹。

对公共静态文件夹中的文件的引用方式与前面相同。

(4)将settings.py 文件中的‘DEBUG=True’改为‘DEBUG=False’后,静态文件访问不了了,该怎么办?(在部署状态下如何使用静态文件?)

在网站开发时我们会将DEBUG 设置为True,以方便错误调试;在网站部署时,需要将DEBUG设置为False,以停止显示详细错误信息,提高网站的安全性。但在将DEBUG 设置为False之后,Django就由开发状态转为部署状态,其不再自动支持对静态文件的访问。此时需要使用第三方文件服务器提供静态文件服务。

开发者需要在settings.py 文件中设定STATIC_ROOT参数,代码如下:

设定之后,运行python manage.py collectstatic 命令,它会将所有的静态文件收集到staticRoot 文件夹之下。staticRoot 文件夹的名称可以由用户自定义,收集命令会自动建立该文件夹。该文件夹地址可以是绝对地址,也可以是相对地址,相对地址是相对项目主目录的地址。该文件夹可以位于项目目录之外。

因为Django 的静态文件服务在效率和安全性方面不够成熟,不建议在部署时使用。需要改为使用其它专业的静态文件服务器,一般比较常用的是Nginx。在静态文件服务器软件中将根目录设置为STATIC_ROOT指定的目录即可。

不使用第三方静态文件服务器,而是用Django 自身也可以在部署状态下提供静态文件服务,详见后文。

(5)不使用django.contrib.staticfiles 能否访问静态文件?

可以。以下方法适用于开发状态。

首先在settings.py 中设置DEBUG=True,然后将所有的静态文件存放在STATIC_ROOT 指定的文件夹中,最后修改项目的根路由文件urls.py,代码如下:

该方法只有技术上的可行性,并没有实用价值,因为在方便性上它不如‘staticfiles’,并且也仅适用于开发状态,列出仅供参考。

(6)STATIC_URL 设置为‘static/’和‘/static/’有何区别?

如果STATIC_URL 设置为‘static/’,那么它将以服务器提供的SCRIPT_NAME 的值为前缀,如果服务器没有设置SCRIPT_NAME,则以‘/’为前缀,最终STATIC_URL 值为‘/static/’。因此,若服务器没有提供SCRIPT_NAME 的话,这两种设置的结果是一样的。如果没有特别的需要,为避免不确定性,建议设置为‘/static/’。

5 静态文件最佳使用策略

Django 在开发状态和部署状态使用了不同的方式来处理静态文件,增加了复杂性。开发者开发过程中经常需要在开发状态和部署状态之间进行切换,此时可能需要反复进行静态文件的收集操作,否则可能导致有些静态文件无法正确显示。有没有一种方法可以避免这种反复的收集操作呢?

有!由于‘django.contrib.staticfiles’在由开发状态转为部署状态后,不再提供静态文件服务。所以我们要放弃使用它,转而通过手动设置提供静态文件服务,从而实现开发状态和部署状态的自由切换。具体实现步骤如下:

第一步:修改项目设置文件settings.py,删除‘django. contrib. staticfiles’和STATICFILES_DIRS,设置STATIC_URL=‘/static/’,STATIC_ROOT=‘staticRoot’。

这一步停止了‘django.contrib.staticfiles’对静态文件的自动管理,并将静态文件的文件夹设定为项目根文件夹下的‘staticRoot’文件夹。

第二步:在项目根路由文件urls.py 中增加以下代码[4]:

以上代码设置了对‘staticRoot’目录下的所有文件的访问路由。使这些文件可以被正常访问到。

这些代码放在根路由文件的末尾,在项目真正需要部署的时候将其注释掉即可。

第三步:由于不再使用‘django.contrib.staticfiles’管理静态文件,所以也不能再使用应用下的static 文件夹和公共静态文件夹存放静态文件。而是必须把所有的静态文件统一放置到一个文件夹下。在第一步中我们设置了STATIC_ROOT=‘staticRoot’,是一个相对于项目根目录的路径,所以需要在项目根文件夹下建立static-Root文件夹,在其中建立应用文件夹和分类文件夹以便于管理静态文件,目录结构如图3所示。

图3 目录结构示例3

第四步在模板文件中使用如下代码进行图片文件引用:

使用这种方式,我们在开发状态和部署状态之间进行切换时,静态文件均可以正常显示,不需要进行其他处理,对于网站开发过程中的运行测试提供了极大的便利。

但在网站正式部署的时候,还是需要使用专业的文件服务器来管理静态文件,以保证效率和安全性。这时需要将第二步中跟路由文件urls.py 中增加的代码删除或注释掉,其它代码无需修改。

6 关于上传文件的使用

上传文件也属于静态文件,Django 对它们的管理方式和以上方式类似。这里仅探讨File-Field 字段对应的文件的上传方式。要实现文件的正确上传,仅需在settings.py 文件中增加以下一条语句:

该文件夹地址可以是绝对地址,也可以是相对地址,相对地址是相对项目主目录的地址。该文件夹可以位于项目目录之外。这里设置的是相对地址,因此需要在项目根目录下建立uploadFiles 文件夹。之后使用Django 提供的admin管理页面就可以正常上传文件了。

如果要访问已上传的文件,需要设置MEDIA_URL 和添加已上传文件的路由。首先编辑settings.py文件,增加以下语句:

接着修改项目的根路由文件urls.py,在其中添加以下语句:

之后就可以实现对已上传文件的正常访问。这种方式同时适用于开发状态和部署状态,在两种状态之间切换时不需要进行其它修改。同样建议在项目正式部署时,改为由其它正式的静态文件服务器提供服务,同时将该条语句注释或删除。

7 结语

本文对Django 静态文件管理机制进行了较为全面的解析,在此基础上使用手动配置文件服务和单一文件夹管理静态文件的方式,实现了Django 项目静态文件管理的优化,使开发者在进行网站开发测试时不需要手动进行静态文件的收集操作及其他文件服务器的配置,简化了开发者的操作,提高了Django 网站开发测试的便利性和工作效率。

猜你喜欢

文件夹静态代码
磁力文件夹
最新进展!中老铁路开始静态验收
猜猜他是谁
创世代码
创世代码
创世代码
创世代码
摸清超标源头 大文件夹这样处理
调动右键 解决文件夹管理三大难题
挂在墙上的文件夹