【问题标题】:How to download image or files from Django model如何从 Django 模型下载图像或文件
【发布时间】:2021-11-07 18:28:27
【问题描述】:

我对 python 有点陌生,我正在创建一个用户可以购买高分辨率图像的网站,现在我正在寻找一种方法让用户从 Django 下载他们购买的图像模型, 这是我的图片模型:

class Pic(models.Model):
    name = models.CharField(max_length = 60, blank = False)
    description_sizes = models.TextField(blank = False, name = 'des_sizes', max_length = 360)
    captured_time = models.DateField(blank = False)
    price = models.IntegerField(blank = False)
    preview = models.ImageField(upload_to = f'static/post/preview/', null = False, blank = False)
    tags = models.CharField(max_length = 1000, blank = False)
    image_files = models.FileField(upload_to ='posts/ogFiles', null = True, blank = False)

我的views.py:

def singlePostView(request, pic_id = None):
    pic = Pic.objects.get(id = pic_id)
    print(pic)

    context = {
    'pic':pic,
    }
    return render(request,"post/single_post_view.html", context)
  

我正在寻找制作按钮或链接以在单个视图中从 pic 模型下载 image_file 的方法,我已经搜索了几天,我刚刚遇到了这些: xsendfile 模块

或像这样使用服务:

 <a  href="/project/download"> Download Document </a>

在 urls.py 中:

url(r'^download/(?P<path>.*)$', serve, {'document root': settings.MEDIA_ROOT}),

对于 xsendfile 模块来说,这并不是一个真正有效的方式

  • 最初是为 Apache 2 和 2.2 设计的。
  • 不是标准的 Apache 模块
  • 自 2011 年以来未维护。

对于 serve,因为它不是受保护的 url,用户可以下载其他路径中的其他文件。

有没有从 Django 模型下载的替代解决方案??

【问题讨论】:

  • 有几个要素需要考虑。首先,图像文件托管在哪里?它们是否在运行 Python 代码的同一台服务器上?其次,购买/交易是如何处理的——你也有 Python 代码吗?需要有一些逻辑来确保允许当前用户下载图像。你现在正在处理吗?
  • @GregSadetsky 是的,图像文件托管在同一台服务器上(使用 Python Web 应用程序),我正在使用 API 进行购买,它返回布尔值天气交易是否完成,然后如果完成,我将在我的上下文和模板中更改 Is_paid 值,它会像这样:{% if Is_paid%} active download link {%else%} inactive download link {%endif%}
  • 好的,这将有助于查看您拥有的所有视图。您是否在视图中获得Is_paid(在用户提交付款后),然后在会话中设置它?您是否将用户已付款的事实存储在数据库中,还是该值仅保存在内存中?我认为一种简单的(即使不是理想的)前进方式是使用会话对象,并注意用户在他们的会话中购买了图像。然后,创建一个新视图来检查这个会话值,然后用文件内容进行响应。

标签: python django django-models django-views django-templates


【解决方案1】:

您可以在标签内添加“下载”属性来下载文件。

<a  href="/project/download" download> Download Document </a>

https://www.w3schools.com/tags/att_a_download.asp

来源:https://stackoverflow.com/a/57803641/10178508

【讨论】:

  • Ik 这个,正如我所说的那样,这不是一种安全的方式,因为我希望对用户可以从服务器获取的文件和图片类型有一些限制,通过这样做,用户可以获取任何类型只需在检查模式下更改 url,即可从服务器文件中获取他们想要的图片或文件
  • 可以在Pic模型中为image_files字段生成复杂的图片名称,然后使用{% if Is_paid%} 下载文档 {%else%} 下载文档 {%endif%}
  • 其实这不是真正的做法,如果您不想让用户在付款后看到 url 您可以使用 post 方法,并在提交表单后自动从服务器下载文件
  • 是的,但问题是用户只能在付款后下载,而不是在他/她想要的任何时候,如果用户想再次下载,这种方式是不可能的
【解决方案2】:

您需要告诉浏览器将响应视为文件附件。

根据Django文档link这是你可以做到的-

response = HttpResponse(my_data, headers={'Content-Type': 'image/jpeg','Content- 
           Disposition': 'attachment; filename="foo.jpeg"'}).

了解 Content-Disposition 标头。

【讨论】:

  • 非常感谢,我在视图中尝试了此操作并为用户设置了一些限制(用户是否已通过身份验证以及购买标志是否已启动),它的工作原理就像一个魅力,用户可以'不要从服务器下载其他文件:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
相关资源
最近更新 更多