五.Django静态文件

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服务就把静态文件发给浏览器!

实际上这几个地址完全可以自定义,只要理解这个过程,就能轻松自定义自己的静态文件提供地址了!

注:本文章内容收集总结于互联网,仅供学习之用!

版权声明:本文为Once_day原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。