Django静态文件
author: Once Day date:2022年2月13日
本文档在于总结相关内容,零散的知识难以记忆学习。
本文档基于windows平台。
全系列文档查看:Django基础知识_CSDN博客。
1.使用静态文件
除了由服务器生成的HTML文件外,WEB应用一般需要提供一些其它的必要文件,比如图片文件、JavaScript脚本和CSS样式表等等,用来为用户呈现出一个完整的网页。在Django中,我们将这些文件统称为“静态文件”,因为这些文件的内容基本是固定不变的,不需要动态生成。
小项目无需担心静态文件的存放问题,而大项目对于静态文件的存放则是需要仔细处理的!
但这正是django.contrib.staticfiles
的用途:它收集每个应用(和任何你指定的地方)的静态文件到一个统一指定的地方,并且易于访问。
首先需要在login文件夹里新建static文件,注意该文件夹的名字要与setting里面STATIC_URL的一致,如:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.0/howto/static-files/
STATIC_URL = 'static/'
Django将在那里查找静态文件,这与Django在login/templates/中寻找对应的模板文件的方式是一致的。
Django的STATICFILES_FINDERS
设置项中包含一个查找器列表,它们知道如何从各种源中找到静态文件。 其中一个默认的查找器是AppDirectoriesFinder
,它在每个INSTALLED_APPS
下查找static
子目录,例如我们刚创建的那个static
目录。admin管理站点也为它的静态文件使用相同的目录结构。
为了每个APP具有独立的命名空间,还需要刚才的static
目录中新建一个login
子目录,再在该子目录中创建一个style.css
文件。换句话说,这个css样式文件应该是login/static/login/style.css
。
良好的目录结构是每个应用都应该创建自己的urls、forms、views、models、tests、apps、templates和static,每个templates包含一个与应用同名的子目录,每个static也包含一个与应用同名的子目录。
写入样式表login/static/login/style.css
下列样式文件:
span {
color: aqua;
}
这表示将标签span里面字体颜色改成青色。
模板文件login/templates/login/rigister.html做以下更改:
{% load static %}{#加载静态文件路径#}
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Once Day 注册界面</title>
<meta name="author" content="Once Day">
<link rel="stylesheet" type="text/css" href="{% static 'login/style.css' %}">
</head>
<body>
<h1>新用户注册<h2>
{#动态url提供注册信息视图函数#}
<form action="{% url 'login:rigister_info' %}" method="post">
{% csrf_token %}{#用于防止跨站请求伪造的安全问题#}
<p><span>用户名:</span>
<input type='text' name='user_name' required>
</p>
<p><span>账户ID:</span>
<input type='number' name='account_id' placeholder="最多8位数字" min="0" max="99999999" required>
</p>
<p><span>密码:</span>
<input type="password" name='password' required>
</p>
<input type='submit'>
</form>
</body>
</html>
{% static %}
模板标签会生成静态文件的绝对URL路径。
重启服务器,在浏览器访问http://127.0.0.1:8000/login/rigister
,可以看到字体变成青色了!
接下来添加一张图片,在login/static/login里新建images文件夹,并放入一张图片,如chair.png
修改login/static/login/style.css文件:
span {
color: aqua;
}
body {
background-image: url("images/chair.png");
background-repeat: no-repeat;
}
重启服务器,访问http://127.0.0.1:8000/login/rigister
,可以看到背景图片了:
输入(http://127.0.0.1:8000/static/login/images/chair.png)可以直接访问这个图片!
2.项目部署
部署时由于使用了apache或者nginx之类的服务,所以静态文件将由它们提供,和Django开发服务器不一样,例如,nginx要求在配置文件里写入静态文件的目录,但django有很多app,不可能每个app地址都写进去,另外,静态文件也可能在其他服务器上提供。
所以,django提供了静态文件收集功能,默认情况下是可用的。
PS E:\django\rmysite> python manage.py -h
Type 'manage.py help <subcommand>' for help on a specific subcommand.
Available subcommands:
......
......
......
[staticfiles]
collectstatic
findstatic
runserver
其中collectstatic就是我们使用的命令,注意,收集的目录由setting.py文件里指定,如:
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR/STATIC_URL #给定收集静态文件的地址根目录+静态目录
第一个是提供给模板文件使用的,第二个就是告诉collectstatic命令收集的地址,确定填好之后,使用命令:
PS E:\django\rmysite> python manage.py collectstatic ’
130 static files copied to 'E:\Django\rmysite\static'.
这就收集完成了,静态文件在static文件夹里的目录结构和在app/static文件夹里一致,所以这就是为什么要命名成appname/static/appname/静态文件的原因了。
之后在nginx上的配置文件直接填写BASE_DIR地址就行了,也就你项目根目录的地址。
可以参考以下配置文件(nginx+uwsgi,部署可见django部署):
server {
listen 80;
listen [::]:80;
server_name 192.168.1.121;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
}
location /static {
alias 项目根目录/static;
}
}
这里解释一下,由于模板文件里使用
<link rel="stylesheet" type="text/css" href="{%%20static%20'login/style.css'%20%}">
提供静态文件url地址,其中static代表STATIC_URL ,这里为 ‘/static/’ ,则这个相对地址为
/static/login/style.css,自动加上域名或ip,
如,https://www.onceday.work/static/login/style.css。这是浏览请求的get的地址,然后你的nginx服务器自动去掉域名或ip,又变回 /static/login/style.css,
然后和location里进行匹配,匹配上/static,alias替换为项目根目录/static,则为:
项目根目录/static/login/style.css
即BASE_DIR/STATIC_URL/login/style.css,这就是静态文件收集的目录,所以nginx服务就把静态文件发给浏览器!
实际上这几个地址完全可以自定义,只要理解这个过程,就能轻松自定义自己的静态文件提供地址了!