Flask:如何将元素从一个 app.route 传输到另一个

问题描述 投票:0回答:1

我目前正在开发一个项目,其中有一个存档,您应该能够从网页中的按钮删除视频。当我通过 python 实现网页时,我在将按钮名称命名为索引(在 for 循环中声明的 (idx))时遇到了麻烦。我需要在 /delete 应用程序路径中单击按钮的名称(索引)(或直接文件名),但无法弄清楚如何正确传输它。按钮本身可以工作。

@app.route('/archive' , methods=['GET', 'POST'])
def archive():  
  
    path = "/home/pi/Videos/"
    print("Files and directories in '", path, "' :")  
    dir_list = os.listdir(path) 
    dir_list.sort()               # The List
    

    output = '''<!DOCTYPE html><html lang="en">... #just some styling
        <div class = Box>
        <div class = flex-box>'''
    
    
    for idx, file in enumerate(dir_list):              #For loop through each element
            
            output += "<div style = 'background: black;'>"+ file +  "</div>" + ''' <form method='post' action='myip/delete'>
    <input class='btn' type='submit' name=idx value='Delete'> </form> ''' 
    output += "</div></div>"
    return output

    
@app.route('/delete', methods=['GET', 'POST'])
def delete_file():
      output = request.form['idx'] 
      os.remove(THEFILEIWANTTODELETE)                    #HERE I NEED TO HAVE THE INDEX OR FILE NAME/ROUTE
      return redirect(url_for('archive'))
        

我已经尝试获取索引,但只获取了按钮的值。

python html flask button
1个回答
0
投票

根据您的示例,这是一个可能的解决方案。

要显示页面,正如 @roganjosh 提到的,您可以将 jinja 与

render_template
render_template_string
一起使用。 Jinja 是一个内置模板引擎,您可以将模板和带有数据的字典传递给它。然后可以根据其密钥在模板中以各种方式使用该数据

要指定要删除的文件,我认为最简单的方法是发送文件名。在这种情况下,使用变量规则内的路径。

from flask import (
    Flask, 
    redirect, 
    render_template_string, 
    url_for
)
import os 

app = Flask(__name__)

@app.route('/archive')
def archive():  
    path = '/home/pi/Videos/'

    dir_list = os.listdir(path) 
    dir_list.sort()
    
    return render_template_string(
        '''
        <!DOCTYPE html>
        <html lang="en">
        <!-- ... -->
        <body>
            <div class="box">
                <div class="flex-box">
                    {% for file in dir_list -%}
                    <div>
                        {{ file }}
                        <form method="post" action="{{ url_for('.delete', filename=file) }}">
                            <input type="submit" value="Delete" />
                        </form>
                    </div>
                    {% endfor -%}
                </div>
            </div>
        </body>
        </html>
        ''', 
        **locals()
    )

@app.post('/delete/<path:filename>')
def delete(filename):
    path = '/home/pi/Videos/'
    try: 
        os.remove(os.path.join(path, filename))
    except: pass
    return redirect(url_for('archive'))
© www.soinside.com 2019 - 2024. All rights reserved.