【问题标题】:Django server side caching of uploaded file上传文件的Django服务器端缓存
【发布时间】:2017-05-30 08:52:38
【问题描述】:

我在 django 中运行一个服务器,我想提供一个文件。我将文件存储在'/upload/directory/filename' 下并使用

from django.shortcuts import redirect

file_path = '/upload/directory/filename'
return redirect(file_path)

但是,该文件似乎已缓存到本地放置的第一个版本并且从未更新。即使我删除了该文件,该文件仍会被提供。我检查了如果我将路径更改为'upload/directory_2/filename,那么我正确地获取了我的新文件。这是怎么回事,我该如何应对?

这是在本地发生的,我正在发出直接的服务器请求(因此不可能进行浏览器缓存或其他任何事情)。

其他信息:

我知道也许我应该使用静态文件,尽管例如this answer 建议我自己上传的文件是值得商榷的。

当我说“我想用 django 提供文件”时,我的意思是我已将文件路径关联到我的数据库中的特定实体(使用 models.FileField),并根据用户的要求我想返回这个文件。我有点怀疑在这种情况下使用静态文件是否明确。

我的问题有很多解决方法,比如每次我想“清除我的缓存”或显式打开文件时生成唯一的文件名:

with open(absolute_file_path) as file:
    response = HttpResponse(file.read(), content_type='application/octet-stream')

我的问题是关于理解为什么上面的特定代码会执行它的作用,即导致数据缓存,以及如何防止这种情况。

【问题讨论】:

标签: python django caching


【解决方案1】:

如果您必须使用 Django 本身执行此操作,我建议您跳过 redirect 并根据以下说明设置您的应用程序:

https://docs.djangoproject.com/en/1.11/howto/static-files/#serving-files-uploaded-by-a-user-during-development

使您的MEDIA_URL 类似于/media/,或者如果您希望它与您当前的情况/upload/ 或其他内容相匹配。 MEDIA_ROOT 可以指向os.path.join(BASE_DIR, 'upload') 和你的FileField(upload_to='directory')

【讨论】:

    【解决方案2】:

    您必须使用 django 静态工具来提供静态文件。在您的本地计算机上,这已在设置中正确设置为在您的应用中指向文件夹 static,然后您可以使用 static 函数指向该文件。

    这里都有解释:

    https://docs.djangoproject.com/en/1.11/howto/static-files/

    在网址中您可以访问代码:

    from django.templatetags.static import static
    url_to_file = static('some_app/path/to_file')
    

    在生产机器上,静态文件由 Web 服务器或特定服务(如 aws S3 或类似服务)提供,但不是来自 django!因此,static 设施是必须的。

    为避免缓存,如果您遇到此问题,请查看never_cache 装饰器:https://docs.djangoproject.com/en/1.11/topics/http/decorators/#caching

    【讨论】:

    • 感谢您的帮助,但在我的情况下使用 @never_cache 并没有什么不同。
    • @vib:您应该使用模型尝试不同的方法
    【解决方案3】:

    Django 中有一个特殊的 HttpResponse 可以帮助您轻松地提供文件。

    def file_dowload(request):
        file_name = request.GET.get('file_name', '')
        try:
            temp = open(file_name, 'rb')
        except IOError:
            temp = None
        if not temp:
            return HttpResponse("Not found")
        response = FileResponse(temp, content_type='text/plain')
    
        return response
    

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 2012-03-19
      • 2011-07-17
      • 1970-01-01
      • 2020-10-28
      • 2011-02-14
      • 1970-01-01
      • 2014-04-05
      • 2021-08-07
      相关资源
      最近更新 更多