有没有办法让一些文件通过直接网址无法访问?例如,图片会显示在页面上,但图片位置不会对其进行处理。
答案 0 :(得分:1)
正常工作的方式 默认情况下,所有静态和媒体文件都是从静态根文件和媒体根文件夹中提供的。一个好的做法是使用NGINX或Apache路由,或使用像Django Whitenoise这样的东西来提供静态文件。
在生产中,你肯定不希望让runserver提供这些文件,因为1)这不能很好地扩展,2)这意味着你在生产中以DEBUG模式运行,这绝对是禁止的
保护这些文件 您可以为大多数不需要保护的文件保留此配置。相反,您可以从不同的文件路径中在Django中提供自己的文件。使用文件字段的upload_to参数指定您希望这些文件存在的位置。例如,
protectedfile = models.FileField(upload_to="protected/")
publicfile = models.FileField(upload_to="public/")
然后在NGINX中将您的块直接指向/ var / www / myproject / MEDIAROOT / public。这将使您能够继续提供公共文件。
同时,对于受保护的文件,视图可以通过以下方式提供这些文件:
def view_to_serve_up_docs(request, document_id):
my_doc = MyDocumentModel.objects.get(id=document_id)
# Do some check against this user
if request.user.is_authenticated():
response = FileResponse(my_doc.privatefile)
response["Content-Disposition"] = "attachment; filename=" + my_doc.privatefile.name
else:
raise Http404()
return response
并在模板中链接到此视图
<a href='/downloadFileView/12345'>Download File #12345 Here!</a>
<强>参考强> 有关FileResponse对象的更多信息:https://docs.djangoproject.com/en/1.11/ref/request-response/#fileresponse-objects