Django/js-将文件发送给用户,称为下载功能



我想通过单击按钮" 下载",让用户下载特定文件。该按钮将与许多切换器链接,因此我编写了一个JS脚本,该脚本将" href "标记指向正确的静态文件。

我试图遵循许多Stackoverflow问题,并阅读有关django staticfiles,媒体文件的文档,但不明白我在情况下需要做什么。任何帮助都将不胜感激,请让我介绍我的所作所为,并寻求您的帮助/意见。

我想让人们下载可以找到的文件:

 "/home/user/xxxx/xxx/project/my_app/static/"

这是我在 views.py 中的功能:

def send_file(request,file_name):
from django.contrib.staticfiles.storage import staticfiles_storage
import os
from wsgiref.util import FileWrapper
import mimetypes
filename =  staticfiles_storage.url(file_name)
download_name = file_name
wrapper = FileWrapper(open(filename))
content_type = mimetypes.guess_type(filename)[0]
response = HttpResponse(wrapper, content_type=content_type)
response['Content-Length'] = os.path.getsize(filename)
response['Content-Disposition'] = "attachment; filename=%s" % download_name
return response

我需要确切的路径来打开文件,所以我做的是我在设置STATIC_URL = "/home/user/xxxx/xxx/project/my_app/static/"上定义。我不喜欢此解决方案,因为之后,如果您检查我的来源,您就有我项目的确切路径。如果我定义了STATIC_URL = "static/",则无效。我寻找一种方法来获取静态文件的确切路径,但它不起作用。这部分有任何帮助吗?

urls.py

    url(r'^download/static/(?P<file_name>[w.]{0,256})$',views.send_file, name='send_file'),

Template.html ,仅按钮部分:

<a href="#" class="button" id="dl-link">Download</a>

JS ,仅在单击开关器时,它更改了HTML按钮的HREF标签:

"if you click on a switcher"
id = switcher-checked
var atag = document.getElementById("dl-link");    
var url = "http://localhost:8000/test/download/static/"+id+".csv";        
atag.setAttribute("href",url);

是否有一个解决方案可以使用{%url'my_app:send_file%}在我的JS中标记?我发现一种解决方案是将脚本直接放入" template.html"中,是一个好行为吗?

我的下载效果很好,但是我觉得我所有的选择都非常糟糕(Static_url和JS var URL定义(。我知道我的问题非常密集,但我确实需要这个帮助。任何例子都将不胜感激。谢谢。

几个点。第一个用于static_url,您可以使用"/static/"使用斜线而不是完整的路径来使用"/static/"。由于您尝试从同一域名下载无需使用完整的URL" http://localhost:8000/your-url"。您只需在JS var URL变量中使用"/您的url"。

django无法渲染JS文件,因此我们只有一个选项,将其保存在template.html中。为了更好地维护JS代码,请尝试在文档加载上使用模板中使用URL声明全局变量,然后在脚本中使用它们。因此该脚本部分将很清楚。对于ex,

var all_my_urls = {
 "url":"{% url 'my_app:send_file'%}"
}

最新更新