这真的让我伤心。我已经处理了好几天了。
当用户从我的django网络应用程序下载文件时,我想通过发送邮件通知上传者他的文件已被下载。问题是,如果我要下载low file size (489kb)
,它会发送mail once to the uploader
。但是,如果我要下载file size of 3mb or above
,它会发送more than one mail to the uploader
。
我只是希望它在每次下载时向上传者发送一封邮件通知。
的观点:
@login_required
def document_view(request,emov_id):
fileload = Emov.objects.get(id=emov_id)
filename = fileload.mov_file.name.split('/')[-1]
filesize=fileload.mov_file.size
response = HttpResponse(fileload.mov_file, content_type='')
response['Content-Disposition'] = 'attachment; filename=%s' % filename
response['Content-Length'] = filesize
send_mail('Your file has just been downloaded',loader.get_template('download.txt').render(Context({'fileload':fileload})),'test@example.com',[fileload.email,])
return response
download.txt
'Your file {{ fileload.name}} have been downloaded!'
如何根据下载请求发送邮件?
答案 0 :(得分:1)
我建议采用不同的方法......
当有人下载文件时,将事件记录到数据库中的表格
写会话ID,文件名,用户名
确保session_id + file_name + user_name为唯一键
这样,您可以获得更多可以在以后帮助您的信息。
稍后(作为crontab批处理或保存监听器)发送电子邮件 您甚至可以发送每日/每周报告等等......
答案 1 :(得分:1)
我认为您只需遵循以下最佳做法即可解决此问题:“不要使用Django提供文件”。
而是在响应中使用X-Sendfile HTTP标头,并配置您的Web服务器以捕获它并提供文件。如果您使用的是Apache,请参阅this。
然后,按如下方式创建响应:
response = HttpResponse()
response['X-Sendfile'] = unicode(filename).encode('utf-8')
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment; filename="%s"' % filename
response['Content-length'] = filesize # Optional
return response