V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
IVeverKB
V2EX  ›  Django

Django 图片可以不作为文件下载的方式返回给前端吗

  •  
  •   IVeverKB · 2021-03-12 11:40:22 +08:00 · 2125 次点击
    这是一个创建于 1112 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个项目是前后端分离的,后端用的 Django 。现前端有个需求是一篇新闻稿需要 [标题+摘要+正文+一张图片] 这些内容。

    我现在只会以文件下载也就是 [ content-type="application/octet-stream"] 返图片给前端(这个方式添加不了其他额外的信息了,至少我不会),标题等其他文字内容通过另一个接口返给前端,这样获取一篇新闻稿就需要两次请求。问能不能只用一次的方式获得这些所有信息?

    另: 现在暂时有一个想法是,前端的

    <img src="..."/>
    

    这种方式,我可以将 src 参数在返回标题摘要时一同给到前端。但这个 src 对于后端的请求方式或者实现本质是什么?是直接用 http get 方式请求这个 URL 吗,自己写了个简单 html 页面打开发现它并没有对我的后端发出请求,所以比较疑惑。。

    15 条回复    2021-03-18 14:46:59 +08:00
    debuggerx
        1
    debuggerx  
       2021-03-12 11:49:55 +08:00
    现在这样才是合理的,想搞成一个接口返回信息和图片内容,看上去是减少了一次请求,实际上却是更浪费的。
    fankcoder
        2
    fankcoder  
       2021-03-12 11:57:03 +08:00
    给他返回图片链接呀
    IVeverKB
        3
    IVeverKB  
    OP
       2021-03-12 12:01:54 +08:00
    #1 @debuggerx ok 谢谢建议!
    #2 @fankcoder 小白问下怎么通过图片链接获取图片?有没有关键字我可以自己找了学一下。。图片链接相当于是自己写的一个 api 可以自定义获取对应图片,还是静态获取,还是。。(是不是说我的关于 img src 的想法是成立的?)
    Latin
        4
    Latin  
       2021-03-12 12:03:59 +08:00
    Latin
        5
    Latin  
       2021-03-12 12:04:49 +08:00
    const img= document.createElement('img');
    img.src = URL.createObjectURL(blob);
    superrichman
        6
    superrichman  
       2021-03-12 12:17:19 +08:00 via iPhone
    把图片转成 base64 插到 img 标签的 src 里面,这样就只有一个请求了,缺点是图片大的话网页加载很慢。

    我觉得你真正需要的可能是开启 http2
    julyclyde
        7
    julyclyde  
       2021-03-12 12:18:20 +08:00
    https://www.thesitewizard.com/html-tutorial/embed-images-with-data-urls.shtml
    用<img src=data 语法可以

    这绝对是 邪教!!
    ch2
        8
    ch2  
       2021-03-12 12:19:41 +08:00
    img 标签可以加载源站的图片,不需要你亲自在后端下载一遍再从自己的服务器传给它
    Vegetable
        9
    Vegetable  
       2021-03-12 12:22:13 +08:00
    当然可以,比如
    图片转成 base64 放到 json 里边 [不推荐]
    图片放在静态文件夹交给 nginx 处理,接口返回图片地址 [推荐]
    HashV2
        10
    HashV2  
       2021-03-12 12:26:22 +08:00
    你返回的数据包含 img 地址就行了

    前端能通过地址拿到图片就行
    eason1874
        11
    eason1874  
       2021-03-12 12:29:05 +08:00
    这种情况一般用 JSON,分 title, excerpt, content, thumbnail,thumbnail 里的是图片文件链接。

    对 API 服务器来说也算只有一个请求,因为图片走另外的文件服务器。如果只能走 API 服务器,你可以在接受 API 请求的用 http2 push 把图片一起推过去,这需要客户端支持。
    imn1
        12
    imn1  
       2021-03-12 12:30:21 +08:00
    如果图片是入库的,就是字节数据,转 base64 随文章一起发过去
    如果图片是文件方式保存的,路径读取权限是所有人,发路径过去就行;如果权限并非所有人,或者不想公开真实路径,这就要换思路了,可以读取后按 base64 发,或者用不占 io 的方式在 web 路径做个映射,然后发这个路径

    一般情况下,建站时就要想好文件读取的权限和路径设置,避免上述麻烦事徒增虚耗
    learningman
        13
    learningman  
       2021-03-12 12:30:53 +08:00
    img 地址有防盗链不?有的话楼上说的都不行
    rationa1cuzz
        14
    rationa1cuzz  
       2021-03-12 13:25:11 +08:00
    一般不会一起返回的,万一图片很大加载很慢的,我们看到的大部分网站都是内容图片分开请求,图片可以是个 url (静态资源),或者单独接口请求图片(字节 /base64 字符串)如果是<img src="..."/> 塞的建议也是路径( url ),而不是 base64 字符串(太大了)
    izoabr
        15
    izoabr  
       2021-03-18 14:46:59 +08:00
    11L 正解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1743 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 89ms · UTC 16:38 · PVG 00:38 · LAX 09:38 · JFK 12:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.