django之上传文件media配置

django之上传文件media配置

静态文件的配置

前文已经提到,网站所用到的静态资源(js文件,css文件,image文件)等,是存储在static 文件夹下的。如何配置django的静态文件了?

开发环境的配置

开发环境即设DEBUG=True

  • 确保INSTALLED_APPS安装了django.contrib.staticfiles模块

  • 定义STATIC_URL:如STATIC_URL = '/static/'

  • 在模板中访问可以有三种方式:

    (1)直接硬编码像/static/lxx.jpg这样;

    (2)或是使用static标签,如:

    {% load staticfiles %}
    <img src="{% static "my_app/myexample.jpg" %}" alt="My image"/>
    

​ (3)在/static/目录下存放静态文件。

总结起来,基本配置就是这几点。

settings.py

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

用户上传文件配置media

与网站所使用的的静态文件夹存储静态资源相对应的是,用户上传的一些静态资源(如,头像,视频等)也需要一个专门的文件夹来存放他们。一般而言,这些用户上传的文件,是存储在一个media的文件夹下。为了前端页面能使用到这些资源,需要走以下的步骤:

(1)配置项目文件settings.py

settings.py
# 配置url映射的路径
MEDIA_URL = '/media/'
# 配置上传文件的存储路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

(2)配置url

 from django.views.static import serve
 from Project.settings import MEDIA_ROOT


	# 暴露后端指定的文件夹资源
 	url(r'^media/(?P<path>.*)$', serve, {'document_root': 'MEDIA_ROOT'})

这样设置以后,用户上传的文件都会存储在media文件夹中。

如果用户上传文件时,指定了上传的路径,如下:、

def path_and_rename(instance, filename):
    """
    uplaod_to: 上传文件的路径
    ext:       文件的后缀名,如'jpg'
    """
    upload_to = 'avatar'
    ext = filename.split('.')[-1]
    filename = f'{uuid.uuid4().hex[:16]}.{ext}'  # 截取16位的uuid码作为文件名称
    return os.path.join(upload_to, filename)

avatar = models.FileField(upload_to=path_and_rename, default='avatar/default.png', verbose_name='用户头像')

那么用户上传的avatar文件将会被保存在/media/avatar/文件夹中。

通过配置url暴露文件的访问接口,用户端轻松的访问这些可以资源

<li class="text-center"><img src="/media/{{ request.user.avatar }}" alt=""/></li>

# 在浏览器中输入文件的url
http://127.0.0.1:8001/media/avatar/0ce4b17ba22c4886.jpg

这种方式虽然为访问特定资源提供了便利,但是对于一些敏感数据(用户数据,源代码),切记不能开设资源访问接口。

补充:图片防盗链技术

图片防盗链技术的原理

	
# 请求来的时候,判断请求是从哪个网站过来的,
	- 如果从自己网站过来则放行
    - 如果从别的网站过来则禁止
    
# 判断的标准,http协议请求头中的参数Referer
	- 该参数用于记录请求来自于哪个网址
    - 如:Referer: http://127.0.0.1:8000/xxx/
原文地址:https://www.cnblogs.com/surpass123/p/13149682.html