django之用户上传文件media配置
回顾静态文件配置
网站所使用的静态文件默认放在static
文件夹下,有如下配置和使用方式。
其实,所有的静态文件也是需要通过url匹配然后响应给前端浏览器的,即需要在urls.py的中做路由设置。
然而,django简化了这些繁琐的设置,只需要我们在配置文件中做简单配置即可,模版文件内使用时按照固定格式即可。
# settings.py
STATIC_URL = '/static/' # 相当于一个令牌
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'), # 在这个路径列表下依次寻找需要的静态文件
]
# 模版文件
{% load static %}
<script src="{% static 'jquery-3.5.1.js' %}"></script>
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'sweet-alert-dist/sweetalert.css' %}">
<script src="{% static 'sweet-alert-dist/sweetalert.min.js' %}"></script>
用户上传文件配置
和网站所使用的静态文件默认放在static
文件夹下的配置类似,用户上传的静态文件也应该单独放在某个文件夹下。一般放在media文件夹内,且需要一些基本配置。否则前端浏览器无法或许相关资源。
"""
media配置
该配置可以让用户上传的所有文件都固定存放在某一个指定的文件夹下
# 配置用户上传的文件存储位置
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 文件名 随你 自己
会自动创建多级目录
如何开设后端指定文件夹资源
首先你需要自己去urls.py书写固定的代码
from django.views.static import serve
from BBS14 import settings
# 暴露后端指定文件夹资源
url(r'^media/(?P<path>.*)', serve, {'document_root':settings.MEDIA_ROOT})
"""
这样设置后后如下几点需要注意:
- 用户表再上传的头像等静态文件都会在media内,即如果当时用户表内的头像字段指定了上传的位置为'avatar/',则此时会在media文件夹内再新建一个avatar文件夹用户保存用户头像图片文件。
class UserInfo(AbstractUser):
avatar = models.FileField(upload_to='avatar/', default='avatar/default.png')
- 保存的用户头像文件,需要开放暴露接口,否则用户无法从浏览器上访问到相关图片。比如博客网站展示用户的头像图片,此时如果没有在后端的urls中开设暴露接口,是无法访问到图片资源的。
# 代码第4行使用了模版语法:渲染后的路径如:/media/avatar/default.png/
<div class="media-left">
<a href="#">
<img class="media-object" src="/media/{{ article.blog.userinfo.avatar }}" alt="..." width="60px">
</a>
</div>
- 这种方式,提供了开放后端文件夹资源的方式,但需要牢记不能随即开放网站隐私信息。
如:开放app01文件夹内的文件接口设置
# settings.py MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # urls.py from django.views.static import serve from BBS import settings urlpatterns = [ url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}), ] # 浏览器输入:http://127.0.0.1:8000/media/views.py, 即可获取views.py文件资源
补充:图片防盗链
基本防盗链原理
# 请求来的时候,判断请求是从哪个网站过来的,
- 如果从自己网站过来则放行
- 如果从别的网站过来则禁止
# 判断的标准,http协议请求头中的参数Referer
- 该参数用于记录请求来自于哪个网址
- 如:Referer: http://127.0.0.1:8000/xxx/