Django学习(7)上传文件和文件储存
2020-04-27 本文已影响0人
乌云老思
前端上传文件[1]
按照规定文件的上传不能使用GET请求,只能用POST。但前端使用upLoadFile()方法时,request.POST
不包含有用的信息,所以与文件同时传的备注信息要写在url里(虽然PSOT的url在地址栏不显示但服务器可以收到),让路由解析参数。
在views中,使用request.FILES获取文件:
from django.http import JsonResponse
def imgup(request, _id):
if request.method == 'POST':
rf = request.FILES['img']
#...
return JsonResponse({'code': 1})
request.FILES
是一个QueryDict
,用法类似字典,方括号中的键名是前端设置的name
。给前端发送一个JSON可以向其告知接收是否成功。
静态文件和媒体文件
settings中有静态文件和媒体文件的配置,与templates的配置过程类似,STATIC_URL
和MEDIA_URL
表示前端访问静态和媒体目录的url地址(二者不可相同),STATIC_ROOT
和MEDIA_ROOT
表示服务器本地的静态和媒体目录的位置。使用步骤:
- settings.py:按实际需要添加,STATIC_URL和MEDIA_URL不可相同
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
- urls.py():用于开发,不用于运营
+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
- template:使用STATIC_ROOT目录下的my_app目录下的example.jpg文件
{% load static %}
<img src="{% static "my_app/example.jpg" %}" alt="My image">
- models.py:
FileField
或ImageField
[2]默认储存到MEDIA_ROOT
的目录下的upload_to
目录,upload_to
需指定
cover_photo = models.ImageField(upload_to='cover_photo')
MEDIA_ROOT
和MEDIA_URL
¶媒体文件由用户上传。他们是不可信任的!确保 web 服务器从未尝试解析这些文件。例如,若用户上传了一个
.php
文件,web 服务器应该永远不要运行它。
现在是检查这些文件的备份策略的好时机。我要怎么使用图片和文件字段?¶
在模型中使用
FileField
或ImageField
,你还需要完成如下步骤:
- 在你的 setting 文件中,你需要定义:setting: <cite>MEDIA_ROOT</cite> 作为 Django 存储上传文件目录的完整路径。(为了提高性能,这些文件不会储存在数据库中)定义: setting: <cite>MEDIA_URL</cite> 作为该目录的基本公共 URL, 确保该目录能够被 Web 服务器的账户写入。
- 在你的模型中添加
FileField
或者ImageField
,可以通过定义:attr:<cite>~django.db.models.FileField.upload_to</cite> 在MEDIA_ROOT
中明确一个子目录用来上传文件。- 所有将被储存在数据库中的文件路径相同(相对于:setting: MEDIA_ROOT
)。你很想用由 Django 提供的:attr:<cite>~django.db.models.fields.files.FieldFile.url</cite>,比如, 如果:class:<cite>~django.db.models.ImageField</cite> 被叫做
mug_shot, 你就可以得到
{{ object.mug_shot.url }}` 图片模板的绝对路径。
collectstatic
- 将
STATIC_ROOT
配置成你喜欢的目录,在这个目录提供服务,例如:
STATIC_ROOT = "/var/www/example.com/static/"
- 运行
collectstatic
管理命令:
$ python manage.py collectstatic
这将会把所有的应用的静态目录(static)下的所有文件拷贝至 STATIC_ROOT
目录。
- 选一个 Web 服务器为这些文件提供服务。 文档 部署静态文件 介绍了静态文件的常见部署策略。