Flask保存favicon.ico时提示目录不存在,请求技术协助
保存favicon.ico时提示「文件/目录不存在」的解决方法
问题详情
尝试保存favicon.ico文件时失败,系统提示「文件/目录不存在」,错误发生在代码的self.file.save行。
错误截图:
相关代码:
配置部分:
app.config['UPLOAD_FOLDER'] = '/static/files/settings/'
表单类代码:
from app import app class SettingsForm: def __init__(self, title, description, file): self.title = title self.description = description self.file = file self.errors = [] def save_img(self): if self.file: if self.allowed_file(): try: os.remove('static/files/settings/favicon.ico') except FileNotFoundError: pass self.file.filename = 'favicon.ico' self.file.save(os.path.join(app.config['UPLOAD_FOLDER'], self.file.filename)) else: self.errors.append('文件格式错误。') def allowed_file(self): return '.' in self.file.filename and self.file.filename.rsplit('.', 1)[1].lower() in EXTENSIONS def change_settings(self): self.save_img() if self.title == '' or self.description == '': self.errors.append('表单内容不完整。') if len(self.errors) != 0: return self.errors with connection.cursor() as cursor: sql = "UPDATE settings SET title = %s, description = %s;" cursor.execute(sql, (self.title, self.description)) connection.commit() return '修改成功。'
问题原因及解决办法
1. 路径不一致导致的目录找不到
配置里的UPLOAD_FOLDER用了绝对路径/static/files/settings/,会直接指向系统根目录下的对应文件夹,而非项目目录内的文件夹;但删除文件时用的是相对路径static/files/settings/favicon.ico,两者路径逻辑混乱。
解决:统一路径规则,推荐两种方式:
# 方式1:使用基于项目根目录的相对路径 app.config['UPLOAD_FOLDER'] = 'static/files/settings/' # 方式2:构建项目内的绝对路径,避免环境差异 import os app.config['UPLOAD_FOLDER'] = os.path.join(app.root_path, 'static/files/settings/')
2. 目标目录未提前创建
如果static/files/settings/目录本身不存在,save方法执行时会直接报错。
解决:在保存文件前检查并自动创建目录:
def save_img(self): if self.file: if self.allowed_file(): upload_dir = app.config['UPLOAD_FOLDER'] # 自动创建目录,已存在则不报错 os.makedirs(upload_dir, exist_ok=True) try: # 统一使用配置的路径,避免相对/绝对路径混乱 os.remove(os.path.join(upload_dir, 'favicon.ico')) except FileNotFoundError: pass self.file.filename = 'favicon.ico' self.file.save(os.path.join(upload_dir, self.file.filename)) else: self.errors.append('文件格式错误。')
3. 代码缩进错误
原代码中self.file.save行存在多余缩进,会导致语法或逻辑错误,需修正缩进:
# 修正后正确缩进的代码 self.file.save(os.path.join(app.config['UPLOAD_FOLDER'], self.file.filename))
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

