Python 瓶子为所有不同的用户提供相同的输出

问题描述

我正在处理一个瓶子项目,代码正在从任何网站下载视频。下载过程没问题,但问题是当两个用户使用我的网站和两个不同的视频 URL 时,服务器会下载文件,但如果返回快速下载我的意思是哪个视频下载速度快,代码将该视频返回给所有用户。这是一个问题,因为当两个用户使用我的网站下载不同的视频时,他们必须需要与提供 url 相同的视频。 所以请帮我把所有用户分开。 所以我需要像,对于每个用户,我的服务器将返回他们粘贴 url 的视频。我使用了线程服务器粘贴。 请帮我找出我该怎么做。


from bottle import route,run,request,static_file

import os
try:
    import youtube_dl
    
except:
    os.system('pip install youtube_dl')
    import youtube_dl
x=[]
def cvtmp3(filename):
        
        p=filename.split('.')
        print(p)
        a=p[0]
        audio=a+'.mp3'
        os.rename(filename,audio)
        print(audio)
        
        
def download(url):
    global filename
#   url=input('type the valid url: ')
    ydl_opts = {'format': 'bestaudio/best'}
    os.chdir('/storage/emulated/0/')
    with youtube_dl.YoutubedL(ydl_opts) as ydl:
        #p=ydl.extract_info('https://www.youtube.com/watch?v=n06H7OcPd-g')
        #print(p)
        info = ydl.extract_info(url,download=True)
        filename = ydl.prepare_filename(info)
        #ydl.download(['https://www.youtube.com/watch?v=n06H7OcPd-g'])


@route('/')
def index():
    return '''
    <!DOCTYPE html>
<html>
<head>
<Meta name="viewport" content="width=device-width,initial-scale=1">
<style>
.loader {
  border: 16px solid #f3f3f3;
  border-radius: 50%;
  border-top: 16px solid #3498db;
  width: 120px;
  height: 120px;
  text-align:center;
  margin-left:auto;
  margin-right:auto;
  
  -webkit-animation: spin 2s linear infinite; /* Safari */
  animation: spin 2s linear infinite;
}

/* Safari */
@-webkit-keyframes spin {
  0% { -webkit-transform: rotate(0deg); }
  100% { -webkit-transform: rotate(360deg); }
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}
</style>
</head>
<body>

<h2>paste any video link to download</h2>
    <form action="/submit" method="post">
    <textarea name="text"></textarea>
    <input type="submit" onclick="show()">
</form>
<div class="loader" style="display:none;"></div>
<script>
function show(){
document.getElementsByTagName("h2")[0].innerText="Please wait :) you will be redirected to download page ";
document.getElementsByTagName("form")[0].style.display="none";
document.getElementsByClassName("loader")[0].style.display="block";}
</script>


'''
@route('/submit',method='POST')

def submit():
    #return "<h1>processing url</h1>"
    
    try:
        
        text=request.forms.get('text')
        if ',' in text:
            urls=text.split(',')
        else:urls=text.split('\n')
    except:pass
    global filename
    x=urls
    for url in urls:
        download(url.strip())
        #return "<h1>processing url</h1>"
    return '''<h1>processing done !!!</h1><br/><a href="/downloading">download</a> '''
    
    #%(os.getcwd()+'/'+filename)
@route('/downloading')

def downloading():
    global urls
    #for i in range(len(x)):
        #print('hao',i)
        #return 'halo'+str(i)
    return static_file(filename,root=os.getcwd(),download=True)

run(port=8080)

我在我的手机上托管了这个,所以如果你有两部手机,你可以检查一下。但有时网址可以更改 Link of the website

解决方法

YouTube 类似,您应该生成具有唯一值的网址 - 即某些唯一编号、来自 YouTube 网址的唯一编号、下载文件的名称等。

/downloading?number=...

/downloading?filename=...

/downloading/<number>

/downloading/<filename>

和函数 downloading 应该使用它来发送正确的文件。


如果使用文件名,则不需要其他变量。但这可能不安全,因为有人可能会使用完整路径来保存密码。


如果您使用来自 YouTube 网址的唯一编号,那么您必须在数据库或至少在全局变量中使用 originaml 文件名记住它

database[unique_number] = filename

以及以后的 downloading 可以使用这个唯一编号来发送正确的文件名。


因为用户可能会提供很多网址,所以您应该使用 for-loop 为每个文件单独生成指向 downloading 的链接。


最少的工作代码

from bottle import route,run,request,static_file,template

import os
try:
    import youtube_dl
except:
    os.system('pip install youtube_dl')
    import youtube_dl
   
# --- functions ---
        
def download(url):
    ydl_opts = {'format': 'bestaudio/best'}
    #os.chdir('/storage/emulated/0/')
    
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        info = ydl.extract_info(url,download=True)
        number = info['id']
        filename = ydl.prepare_filename(info)
        return number,filename
        
# --- pages ---

@route('/')
def index():
    return '''
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
.loader {
  border: 16px solid #f3f3f3;
  border-radius: 50%;
  border-top: 16px solid #3498db;
  width: 120px;
  height: 120px;
  text-align:center;
  margin-left:auto;
  margin-right:auto;
  
  -webkit-animation: spin 2s linear infinite; /* Safari */
  animation: spin 2s linear infinite;
}

/* Safari */
@-webkit-keyframes spin {
  0% { -webkit-transform: rotate(0deg); }
  100% { -webkit-transform: rotate(360deg); }
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}
</style>
</head>
<body>

<h2>paste any video link to download</h2>
    <form action="/submit" method="post">
    <textarea name="text"></textarea></br>
    <input type="submit" onclick="show()">
</form>
<div class="loader" style="display:none;"></div>
<script>
function show(){
document.getElementsByTagName("h2")[0].innerText="Please wait :) you will be redirected to download page ";
document.getElementsByTagName("form")[0].style.display="none";
document.getElementsByClassName("loader")[0].style.display="block";}
</script>
'''


@route('/submit',method='POST')
def submit():
    try:
        text = request.forms.get('text')
        if ',' in text:
            urls = text.split(',')
        else:
            urls = text.split('\n')
    except Exception as ex:
        print('[Exception]',ex)

    all_items = []
    
    for url in urls:
        url = url.strip()
        number,filename = download(url)
        database[number] = filename
        all_items.append( (number,filename) )

    return template('''<h1>processing done !!!</h1><br/>
% for number,filename,in items:
      Download: <a href="/downloading/{{number}}">{{filename}}</a></br>
% end
''',items=all_items)

    
@route('/downloading/')   # to catch url without number
@route('/downloading/<number>')
def downloading(number=None):
    if (not number) or (number not in database):
        return "WRONG NUMBER"
        
    filename = database[number]
    print('filename:',filename)

    return static_file(filename,root=os.getcwd(),download=True)


if __name__ == '__main__':

    database = dict()
    
    run(port=8080)