问题描述
问题是我在 pythonanywhere 上使用 django 托管。视频也在 pythonanywhere 服务器和用户/客户端系统上下载。这就是我使用 os 的原因。删除(路径)。下载后从服务器中删除。
有没有什么方法可以在 pyhtonanywhere 服务器上不写入文件。所以我不使用 os.remove(path)。 如何限制在 pythonanywhere 服务器上写入。只能在用户系统下载。
def fb_download(request):
link = request.GET.get('url')
html= requests.get(link)
try:
url= re.search('hd_src:"(.+?)"',html.text)[1]
except:
url= re.search('sd_src:"(.+?)"',html.text)[1]
path=wget.download(url,'Video.mp4')
response=FileResponse(open(path,'rb'),as_attachment=True)
os.remove(path)
return response
解决方法
如果我理解正确,您正试图从浏览器获取包含 URL 的请求。然后,您访问该 URL 处的页面并从中提取另一个 URL,然后您希望将第二个 URL 的内容(视频)呈现给浏览器。
您这样做的方法是将文件下载到服务器,然后将其作为文件附件提供给浏览器。
如果你这样做,那么就没有办法避免在服务器上写入文件;实际上,您现在的操作方式可能会出现问题,因为您在将响应返回给浏览器之前删除了文件,因此可能会出现(取决于文件删除的处理方式以及 FileResponse
缓存文件的内容)在没有文件发送回浏览器的情况下。
但另一种可行的方法是向 URL 发送重定向响应——变量 url
中的那个——就像这样,根本不下载它:
def fb_download(request):
link = request.GET.get('url')
html= requests.get(link)
try:
url= re.search('hd_src:"(.+?)"',html.text)[1]
except:
url= re.search('sd_src:"(.+?)"',html.text)[1]
return redirect(url)
通过这样做,下载发生在浏览器而不是服务器上。