美文网首页
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