美文网首页
Django学习(7)上传文件和文件储存

Django学习(7)上传文件和文件储存

作者: 乌云老思 | 来源:发表于2020-04-27 08:38 被阅读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_URLMEDIA_URL表示前端访问静态和媒体目录的url地址(二者不可相同),STATIC_ROOTMEDIA_ROOT表示服务器本地的静态和媒体目录的位置。使用步骤:

  1. 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')
  1. urls.py():用于开发,不用于运营
 + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
 + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
  1. template:使用STATIC_ROOT目录下的my_app目录下的example.jpg文件
{% load static %}
<img src="{% static "my_app/example.jpg" %}" alt="My image">
  1. models.py:FileFieldImageField[2]默认储存到MEDIA_ROOT的目录下的upload_to目录,upload_to需指定
cover_photo = models.ImageField(upload_to='cover_photo') 

MEDIA_ROOTMEDIA_URL

媒体文件由用户上传。他们是不可信任的!确保 web 服务器从未尝试解析这些文件。例如,若用户上传了一个 .php 文件,web 服务器应该永远不要运行它。
现在是检查这些文件的备份策略的好时机。

我要怎么使用图片和文件字段?

在模型中使用 FileFieldImageField ,你还需要完成如下步骤:

  1. 在你的 setting 文件中,你需要定义:setting: <cite>MEDIA_ROOT</cite> 作为 Django 存储上传文件目录的完整路径。(为了提高性能,这些文件不会储存在数据库中)定义: setting: <cite>MEDIA_URL</cite> 作为该目录的基本公共 URL, 确保该目录能够被 Web 服务器的账户写入。
  2. 在你的模型中添加 FileField 或者 ImageField ,可以通过定义:attr:<cite>~django.db.models.FileField.upload_to</cite> 在 MEDIA_ROOT 中明确一个子目录用来上传文件。
  3. 所有将被储存在数据库中的文件路径相同(相对于: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

  1. STATIC_ROOT 配置成你喜欢的目录,在这个目录提供服务,例如:
STATIC_ROOT = "/var/www/example.com/static/"
  1. 运行 collectstatic 管理命令:
$ python manage.py collectstatic

这将会把所有的应用的静态目录(static)下的所有文件拷贝至 STATIC_ROOT 目录。

  1. 选一个 Web 服务器为这些文件提供服务。 文档 部署静态文件 介绍了静态文件的常见部署策略。

  1. 知乎-Django 图片及文件上传、存储与显示

  2. 模型字段参考

相关文章

网友评论

      本文标题:Django学习(7)上传文件和文件储存

      本文链接:https://www.haomeiwen.com/subject/kpcclhtx.html