首页 > 编程问答 >Flask 桌面应用程序文件选择器

Flask 桌面应用程序文件选择器

时间:2024-07-28 14:21:11浏览次数:9  
标签:python python-2.7 flask

我正在尝试使用 Flask 为桌面应用程序构建 GUI(即在与嵌入式浏览器本地捆绑运行的服务器上运行的 Web 应用程序)。目前看来一切正常,但我想添加一个文件选择器以允许用户选择计算机上的目录。我需要目录的完整路径,因此使用 HTML/JavaScript 打开对话框将不起作用(由于安全限制)。

我尝试做的是在按下按钮时启动 Tkinter 文件对话框这一页。问题是,虽然它似乎确实启动了某些东西,但该过程只是冻结(不显示窗口)并且我被迫终止它,之后页面重定向到“/view_1_actions”并且我收到“错误代码:ERR_EMPTY_RESPONSE” “错误(即 Flask 应用程序仅在我杀死看似对话框窗口的内容后才会崩溃)。

这是我的代码:

HTML:

<form action="/view_1_actions" method="post">
    <input type="submit" name="submit" value="Select"></input>
</form>

Python:

from flask import Flask, request, redirect
from Tkinter import Tk
from tkFileDialog import askdirectory

@app.route('/view_1_actions', methods = ['POST'])
def view_1_actions():
    if request.form['submit'] == 'Select':
        Tk().withdraw()
        dirname = askdirectory()
    return redirect('/')

这确实是一个相当奇怪的场景,因为您不会通常不会在“服务器端”启动图形界面,但我的问题是是否有一种方法可以解决此问题,或者是否有一种替代解决方案可以用来显示文件选择器对话框(最好是每个操作系统的本机对话框)。


你指出了问题的关键:在 Flask 服务器上运行的 Web 服务器的上下文中混淆了服务器端代码和客户端代码。虽然你的 Flask 应用是用 Python 编写的(Tkinter 也是如此),但这并不意味着你可以直接从 Flask 路由打开一个 Tkinter 对话框。Flask 路由的目的是处理 HTTP 请求并发送回 HTTP 响应(比如 HTML 页面、JSON 数据等)。

你不能做的是 直接从 Flask 路由打开一个“客户端”文件选择器对话框。

你可以做的是 利用 HTML 文件输入元素,并将其设置为允许选择文件夹:

HTML (index.html):

<!DOCTYPE html>
<html>
<head>
<title>选择文件夹</title>
<script>
  function submitForm() {
    document.getElementById('folderForm').submit();
  }
</script>
</head>
<body>
  <form id="folderForm" action="/upload" method="POST" enctype="multipart/form-data">
    <input type="file" id="folderInput" name="folder" webkitdirectory="" directory="" multiple/>
    <br>
    <button type="button" onclick="submitForm()">上传</button>
  </form>
</body>
</html>

Python (app.py):

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/upload', methods=['POST'])
def upload():
    if 'folder' in request.files:
        folder = request.files['folder']
        # folder 在这里是一个 FileStorage 对象
        # 你可以像处理任何其他上传文件一样处理它
        print(f"选中的文件夹: {folder.filename}") 
        # 进一步处理文件夹(例如,保存、读取内容等)
    else:
        return "没有选择文件夹"

    return '文件上传成功!'

if __name__ == '__main__':
    app.run(debug=True)

说明:

  1. HTML 文件输入:
  2. <input type="file" webkitdirectory directory multiple /> 创建了一个文件输入元素, webkitdirectory directory 属性使它能够选择文件夹。
  3. multiple 属性允许选择多个文件夹(如果需要)。

  4. JavaScript 提交:

  5. 我们使用一个简单的 JavaScript 函数 submitForm() 来提交表单,因为点击文件输入按钮选择文件夹不会自动提交表单。

  6. Flask 路由:

  7. /upload 路由处理上传。
  8. 我们检查 request.files 中是否存在名为 'folder' 的文件。
  9. 如果找到了,我们就可以访问 folder 对象,它是一个 FileStorage 对象,代表选中的文件夹。你可以获取它的文件名和其他元数据。

重要说明:

  • 此方法依赖于现代浏览器对 webkitdirectory directory 属性的支持。
  • 由于安全限制,你只能访问用户明确选择的文件夹,而不能访问整个文件系统。
  • 你需要一种方法来处理上传的文件夹,比如将它们保存在服务器上或读取它们的内容。

这种方法提供了一种更安全、更符合 Web 标准的方式来让用户在你的 Flask 应用程序中选择文件夹。

标签:python,python-2.7,flask
From: 23775211

相关文章

  • 20、flask-进阶-自定义静态文件static和模板文件templates的路径配置
    自定义static目录和templates目录的路径原本flask默认的static和templates目录是在App目录下的:如下图如果想把这两个目录更改位置,如放在根目录下:代码如下:__init__.pyfromflaskimportFlaskfrom.viewsimportbluefrom.extsimportinit_extsimportos#获......
  • Python终端输出彩色字符方法
    colorama是一个python专门用来在控制台、命令行输出彩色文字的模块,完全兼容linux和windows各个版本。 1.Python3.x中安装colorama模块: pipinstallcolorama'''可用格式常数:【颜色RED,GREEN都需要大写】Fore:BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHI......
  • 我无法安装 pygame 模块,所以我尝试观看视频,它告诉我这样做。在那个视频中他得到了 pyt
    c:\User\admin>piplistSyntaxError:unexpectedcharacterafterlinecontinuationcharacter我试图获取python模块列表,但出现语法错误出现SyntaxError:unexpectedcharacterafterlinecontinuationcharacter错误是因为你的用户名中包含一个特殊字符......
  • python第五节--conda命令
    这里写自定义目录标题基本命令环境管理包管理环境文件环境变量Conda配置高级操作常见问题基本命令检查Conda版本:conda--version更新Conda:condaupdateconda环境管理创建新环境:condacreate--namemyenv创建包含特定Python版本的新环境:conda......
  • 19、flask-进阶-内置对象
    内置对象g对象:global全局对象g对象是专门用来保存用户的数据的g对象在一次请求中的所有的代码的地方都是可以使用的突变变量存储位置的限制,为函数传递添加了新的方式,比如我们在before_request产生一个数据在后面需要使用,可以保存在g对象中,就可以在其他视图中使用这个数......
  • 如何使用python向另一台计算机发送请求
    基本上我有一个聊天室,我将把它变成一个网络(我知道这听起来没有多大意义),但基本上我想知道是否可以让python脚本捕获计算机上的所有传出请求并将其发送到另一台计算机(c2)。然后我希望c2自己发出请求。这是对我正在做的事情的淡化解释,但任何帮助都会很棒!当然可以!虽然从头......
  • 18、flask-进阶-插件-缓存flask-caching - 钩子函数(中间件)
    1.认识flask-caching插件使用插件1.安装$flaskinstallflask-caching2.初始化在exts.py中导入并初始化fromflask_cachingimportCache#初始化插件cache=Cache(config={'CACHE_TYPE':'simple'#缓存类型})#和app对象绑定definit_exts(app):......
  • 如何在flask和jinjia2模板中仅显示一个登录或注销按钮?
    我想在用户登录时显示注销按钮,在用户注销时显示登录按钮。但是这些按钮显示的次数与我有用户的次数一样多。我该如何修复它?--htmlcode{%foruserinusers%}{%ifuser.user_id==session['user_id']%}<liclass="nav-item">......
  • AttributeError:'int'对象没有属性'index'(python)
    我正在Python上进行“猜单词”,但我无法弄清楚这个错误。AttributeError:'int'objecthasnoattribute'index'(python)它在线上给了我一个错误letterIndex=word.index(guess)defcheckLetter(word):blanks='_'*len(str(word))print('W......
  • 尝试在Python中使用for循环来输出大于或等于序列中的数字
    这是我的Python代码:largest_so_far=-1print('before',largest_so_far)forthe_numin[9,41,12,3,74,15]:ifthe_num>largest_so_far:largest_so_far=the_numprint(largest_so_far,'isbiggerthan',the_num)......