我们在编写模板文件时,需要大量引用css、js、图片等静态文件,如果我们将这些文件在服务端存放的路径都固定写死那么将非常不利于后期的扩展,我们可以这么做
1:将static文件夹路径配置到settings.py中
# settings.py文件中:
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'statics') # 获取静态文件在服务端的绝对路径
]
#STATIC_URL = '/static/'就是为静态文件的绝对路径起了一个别名,以后我们只需要用路径/static/即可
2、在项目根目录下新增文件夹statics,为了更便于管理,可以在statics下新建子文件夹css、js、img等
3.利用解析器"动态解析"静态文件接口前缀
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--注意:必须先加载文件static.py-->
{% load static %}
<!--注意:此处的static是一个定义在static.py中的一个标签,名字与文件名一样而已,不要搞混-->
<link rel="stylesheet" href="{% static 'css/my.css' %}">
</head>
<body>
<h4>我是红色的,点我就绿</h4>
<img src="{% static 'img/rb.jpeg' %}" alt="">
{% load static %}
<script src="{% static 'js/jquery-3.3.1.min.js' %}"></script>
<script src="{% static 'js/my.js' %}"></script>
</body>
标签static会接收传入的参数,然后这根据settings.py中变量STATIC_URL的值拼接出一个完整的路径,如果STATIC_URL = '/static/',那么href="{% static 'css/my.css' %}"会被渲染成href="/static/css/my.css",如果STATIC_URL = '/static123/',那么href="{% static 'css/my.css' %}"会被渲染成href="/static123/css/my.css"。
注意:
# 在settings.py文件中:
STATIC_URL = '/static/' # 这个static不是文件夹的名字 而是接口前缀
"""只要你想访问静态文件中的资源 文件路径就必须用static开头"""
# 手动将static文件夹中所有的资源暴露给用户
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'), # 真正的文件夹路径
os.path.join(BASE_DIR,'static1'), # 真正的文件夹路径
os.path.join(BASE_DIR,'static2'), # 真正的文件夹路径
os.path.join(BASE_DIR,'static3') # 真正的文件夹路径
] # 一旦你是以接口前缀开头的 那么就会自动拿着接口前缀后面的文件路径去列表中一个个的文件夹中查找文件
案例:
1.开发调试模式:
settings.py
DEBUG = True
ALLOWED_HOSTS = []
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
xxx.html
<head>
<meta charset="UTF-8">
<title>online</title>
{% load static %}
<script src="{% static 'jq/jquery.min.js' %}"></script>
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
<link rel="stylesheet" href="{% static 'dist/sweetalert.css' %}">
<script src="{% static 'dist/sweetalert.min.js' %}"></script>
</head>
2.生产环境
项目上线,会将 debug=True 改成 debug=Flase, 这样的话,静态文件会出现加载不出来的问题,所以要进行如下更改
settings.py
DEBUG = False
ALLOWED_HOSTS = ['*']
STATIC_URL = '/static/'
# 项目根目录下的static文件夹
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = (
os.path.join(BASE_DIR,"static").replace("\\","/"),
)
urls.py
from django.views import static
from django.conf import settings
urlpatterns = [
url(r'^static/(?P<path>.*)$', static.serve, {'document_root': settings.STATIC_ROOT }, name='static'),
]
如果静态文件还是不能加载的话,可以考虑把html页面中js,css的本地引用换成cdn方式的应用:
<head>
<meta charset="UTF-8">
<title>login</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
<link href=“https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.css” rel=“stylesheet”>
<script src="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.js"></script>
</head>
或者可以启动django项目时强行加载静态文件的方式启动
python manage.py runserver ip:port --insecure
media配置
media配置 可以暴露给用户任意的后端资源
网站所使用的静态文件默认都是放在static文件夹下
用户上传的静态文件 也应该放在一个固定的文件夹下
我们目前实现的是用户上传的头像 固定放在avatar文件夹下了
我们应该创建一个类似于static文件夹 里面在根据文件的不同创建不同的文件夹存储数据
# 规定 用户上传的所有的静态文件 全部放到media文件夹下
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
from django.views.static import serve
from 项目名 import settings
# 手动暴露后端文件夹资源
url(r'^media/(?P<path>.*)',serve,{"document_root":settings.MEDIA_ROOT}),
补充:
Static和Media的区别: https://www.cnblogs.com/dreamkeeper/p/7749439.html