Django后端开发——静态文件

本文围绕Django中静态文件展开,介绍了静态文件概念,如图片、css等。阐述了在settings.py中的配置,还给出两种静态文件访问方案,包括直接拼接路径和通过{% static %}标签访问,推荐使用标签访问,因其更具动态性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


参考资料

B站网课:点击蓝色字体跳转
或者复制网址在浏览器访问:https://www.bilibili.com/video/BV1vK4y1o7jH?p=13&vd_source=597e21cf34ffcdce468ba00be2177e8a


静态文件

什么是静态文件

如:图片、css、js、音频、视频

静态文件配置 - settings.py中

在这里插入图片描述
在这里插入图片描述

STATIC_URL = 'static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR,'static'),)

以下一行代码是手动添加的,指定了一个目录——‘static’,将在该目录下查找静态文件

STATICFILES_DIRS = (os.path.join(BASE_DIR,'static'),)

静态文件访问

模板中访问静态文件 - img标签为例

方案1 - 直接拼接访问路径

在这里插入图片描述

static目录下

在mysite3下-new-directory-static(与前面定义的目录名要相一致)
在这里插入图片描述
在static目录下可添加文件夹(image、css、js等)

在火狐浏览器找到图片另存至桌面,重命名,复制图片至static下的image文件夹

在课程中的示例图片为jpg格式,但是我在网站上找到的图片是webp格式,最终实践可知并不会产生影响

test_static.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试静态文件</title>
</head>
<body>

<img src="http://127.0.0.1:8000/static/image/cow.webp"
     width="200px" height="200px">

<img src="/static/image/cow.webp" width="200px"
     height="200px">

</body>
</html>
views.py
from django.shortcuts import render


def test_static(request):

    return render(request,'test_static.html')
urls.py
from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test_static',views.test_static)
]
效果

在这里插入图片描述
ctrl+shift+i 可调出开发者工具
在这里插入图片描述

方案2 - 通过{% static %}标签访问静态文件

test_static.html

只需修改html文件,其他访问操作同上(views.py等)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试静态文件</title>
</head>
<body>

<img src="http://127.0.0.1:8000/static/image/cow.webp"
     width="200px" height="200px">

<img src="/static/image/cow.webp" width="200px"
     height="200px">

{% load static %}
<img src="{% static 'image/cow.webp' %}"
     width="200px" height="300px">

</body>
</html>

添加内容:

{% load static %}
<img src="{% static 'image/cow.webp' %}"
     width="200px" height="300px">

这里为了区别方案1的两张图片和方案2的一张图片,特意将方案2的图片height设置为300px

效果

在这里插入图片描述
从左至右:绝对路径 相对路径 Django标签
推荐:方案2——更动态

若现在要求statics的请求才是静态资源请求:
需在settings.py中进行修改:

STATIC_URL = 'static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR,'static'),)

改为

STATIC_URL = 'statics/'
STATICFILES_DIRS = (os.path.join(BASE_DIR,'static'),)

再次刷新页面
在这里插入图片描述
只有用标签写的图片能正常访问,标签更动态

小结

本文介绍了静态文件的配置和静态文件访问的两种方案(三种方法)
其中用标签访问静态文件是最为推荐的方法,因为其更加动态

### 实现图片存储与显示的方法 #### Django 后端配置 为了在Django项目中处理图像上传并将其保存至MySQL数据库,需先安装`Pillow`库来支持图像文件的操作。可以通过命令行执行 `pip install Pillow` 完成安装。 接着,在模型定义里引入`ImageField`字段用于表示要存储的图片路径: ```python from django.db import models class UserProfile(models.Model): avatar = models.ImageField(upload_to='avatars/', null=True, blank=True) ``` 上述代码片段表明每个用户的个人资料可以关联一张头像图片[^1]。 对于数据库连接设置方面,则按照给定的方式修改`settings.py`内的`DATABASES`字典项以适配MySQL环境[^3]。 当涉及到实际的数据迁移操作时,应确保已成功创建相应的表格结构以便后续能够正常存取数据记录。这一步骤可通过运行`python manage.py makemigrations` 和 `python manage.py migrate` 来完成。 #### API接口设计 为了让前端能顺利发送请求并将图片提交给服务器,需要编写视图函数负责接收HTTP POST请求,并调用序列化器验证传入的数据合法性之后再保存实例对象到数据库中去。这里给出一个简单的例子作为参考: ```python from rest_framework.views import APIView from rest_framework.response import Response from .serializers import UserSerializer from .models import UserProfile class UploadImageView(APIView): def post(self, request): serializer = UserSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) return Response(serializer.errors, status=400) ``` 此段程序展示了如何基于RESTful风格构建适合移动端或网页使用的API服务端点。 #### Vue 前端实现 在Vue组件内部,使用HTML `<input type="file">`标签允许用户选取本地磁盘上的文件;随后借助Axios发起异步POST请求向指定URL地址传送所选文件的内容流形式。下面是一份简化版的模板代码样例: ```html <template> <div id="app"> <!-- 文件输入框 --> <input @change="onFileChange" type="file"/> <!-- 显示预览图 --> <img v-if="imageSrc" :src="imageSrc" alt="Preview Image"/> </div> </template> <script> import axios from 'axios'; export default { name: 'App', data() { return { imageSrc: '' } }, methods:{ onFileChange(e){ const file = e.target.files[0]; let formData = new FormData(); formData.append('avatar', file); axios.post('/api/upload-image/', formData,{ headers: {'Content-Type': 'multipart/form-data'} }).then(response => { console.log(response); // 更新页面上显示的图片源链接 this.imageSrc = response.data.avatar; }); } } } </script> ``` 这段脚本实现了基本的功能——即让用户可以选择想要上传的照片并通过AJAX方式传递给后台进行持久化处理,同时还能即时更新界面上呈现出来的视觉效果。 #### 额外注意事项 考虑到安全性因素,建议对上传文件大小加以限制,并且只接受特定类型的媒体格式(比如JPEG、PNG)。另外还要记得调整Web服务器配置使得静态资源得以正确加载出来供客户端访问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

^_^2412

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值