如何将 python flask 应用程序中的 windows 文件夹与 sqlite 数据库 table 同步?
How to synchronize a windows folder in python flask app with a sqlite database table?
我正在寻找一种解决方案,用于将 sqlite 数据库中的文件名与 windows 目录中的文件名进行比较 (app.config['UPLOAD_FOLDER'])。
我有一个 sqlite 数据库,其中有一个名为“文件”的 table,其中包含我文件中的所有数据。
file 定义为:files = [file.to_displayable_dict() for file in File.query if is_file_visible(file)] 这是函数:
def to_displayable_dict(self):
return {
"Dateiname" : "<div class=hasTooltip> <a href=/download/" + self.name + ">" + self.name + "</a> <span>" + self.beschreibung + "</span></div>",
"Kategorie" : self.kategorie,
"Bezeichnung" : self.bezeichnung,
"TV" : self.tv,
"Stand" : self.stand,
"Upload-Benutzer" : self.uploadbenutzer,
"Vertraulichkeitsstufen" : self.Vertraulichkeitsstufen
}
在 sqlite table 文件中,如果我打印 ("Files:", files) LOOK 添加了其他评论,我就有这种数据。
如果我进入我的 windows 实例文件夹 (app.config['UPLOAD_FOLDER']) 并删除文件 (Dateiname: EPEX_SPOTPRICE_STROM),它应该会自动删除文件在我的 database.db.
的文件 table 中
对于解决方案,必须比较 WIndows 目录中的文件名和 table 文件中的文件名。
因为href,我不知道如何进行比较。我的想法是,但不起作用。 Post 对路由的操作不是一个好的解决方案。
something like get_files = os.listdir(app.config['UPLOAD_FOLDER'])
for file in Files.query():
if file.filename not in files_in_folder:
db.session.delete(file.filename)
db.session.commit()
flash (data was deleted )
在 python 烧瓶下你会怎么做?对自己的代码示例有什么建议吗?谢谢!
我试着绕过这个:
import os
path = r"C:/Users/add706/Documents/NRL_webseite/instance/uploads"
def get_files(path):
for file in os.listdir(path):
if os.path.isfile(os.path.join(path, file)):
yield file
for file in get_files(path):
print("file:", file)
该文件的输出:EPEX_SPOTPRICE_STROM.docx
如果您想要一个端点,从数据库中删除所有不再物理存在于文件系统中的文件引用,代码应如下所示。
@app.route('/sync')
def sync():
files = os.listdir(app.config['UPLOAD_FOLDER'])
if File.query.filter(File.name.notin_(files)).delete():
db.session.commit()
return redirect(url_for('index'))
另一种选择是使用我不太熟悉的文件系统事件。下面是使用 watchdog.
的示例代码
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
# ...
class MyHandler(FileSystemEventHandler):
def on_deleted(self, event):
if not event.is_directory:
target = event.src_path[len(app.config['UPLOAD_FOLDER'])+1:]
if File.query.filter_by(name=target).delete():
db.session.commit()
def run_watcher(path):
fs_handler = MyHandler()
observer = Observer()
observer.schedule(fs_handler, path, recursive=False)
observer.start()
run_watcher(app.config['UPLOAD_FOLDER'])
也可以有一个定期执行并删除所有无效条目的脚本。
我正在寻找一种解决方案,用于将 sqlite 数据库中的文件名与 windows 目录中的文件名进行比较 (app.config['UPLOAD_FOLDER'])。
我有一个 sqlite 数据库,其中有一个名为“文件”的 table,其中包含我文件中的所有数据。
file 定义为:files = [file.to_displayable_dict() for file in File.query if is_file_visible(file)] 这是函数:
def to_displayable_dict(self):
return {
"Dateiname" : "<div class=hasTooltip> <a href=/download/" + self.name + ">" + self.name + "</a> <span>" + self.beschreibung + "</span></div>",
"Kategorie" : self.kategorie,
"Bezeichnung" : self.bezeichnung,
"TV" : self.tv,
"Stand" : self.stand,
"Upload-Benutzer" : self.uploadbenutzer,
"Vertraulichkeitsstufen" : self.Vertraulichkeitsstufen
}
在 sqlite table 文件中,如果我打印 ("Files:", files) LOOK 添加了其他评论,我就有这种数据。
如果我进入我的 windows 实例文件夹 (app.config['UPLOAD_FOLDER']) 并删除文件 (Dateiname: EPEX_SPOTPRICE_STROM),它应该会自动删除文件在我的 database.db.
的文件 table 中对于解决方案,必须比较 WIndows 目录中的文件名和 table 文件中的文件名。
因为href,我不知道如何进行比较。我的想法是,但不起作用。 Post 对路由的操作不是一个好的解决方案。
something like get_files = os.listdir(app.config['UPLOAD_FOLDER'])
for file in Files.query():
if file.filename not in files_in_folder:
db.session.delete(file.filename)
db.session.commit()
flash (data was deleted )
在 python 烧瓶下你会怎么做?对自己的代码示例有什么建议吗?谢谢!
我试着绕过这个:
import os
path = r"C:/Users/add706/Documents/NRL_webseite/instance/uploads"
def get_files(path):
for file in os.listdir(path):
if os.path.isfile(os.path.join(path, file)):
yield file
for file in get_files(path):
print("file:", file)
该文件的输出:EPEX_SPOTPRICE_STROM.docx
如果您想要一个端点,从数据库中删除所有不再物理存在于文件系统中的文件引用,代码应如下所示。
@app.route('/sync')
def sync():
files = os.listdir(app.config['UPLOAD_FOLDER'])
if File.query.filter(File.name.notin_(files)).delete():
db.session.commit()
return redirect(url_for('index'))
另一种选择是使用我不太熟悉的文件系统事件。下面是使用 watchdog.
的示例代码from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
# ...
class MyHandler(FileSystemEventHandler):
def on_deleted(self, event):
if not event.is_directory:
target = event.src_path[len(app.config['UPLOAD_FOLDER'])+1:]
if File.query.filter_by(name=target).delete():
db.session.commit()
def run_watcher(path):
fs_handler = MyHandler()
observer = Observer()
observer.schedule(fs_handler, path, recursive=False)
observer.start()
run_watcher(app.config['UPLOAD_FOLDER'])
也可以有一个定期执行并删除所有无效条目的脚本。