You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flask远程服务器文件路径配置错误致404问题排查

排查Flask文件下载404问题的思路与解决方案

嘿,我来帮你捋捋这个问题!你本地运行正常但服务器上出404,确实大概率和路径或者代理配置有关,咱们一步步来排查:

一、先盯紧路径问题(最可能的元凶)

你的代码里藏着一个容易忽略的细节:创建zip文件时用的是相对路径gen.zip,这意味着文件会生成在Flask应用当前的工作目录下,但send_from_directory却跑去/home/localadmin/test目录找这个文件。如果服务器上Flask的运行目录和这个绝对路径不匹配,那自然找不到文件,返回404就不奇怪了。

给你两个修复方向:

  1. 统一绝对路径:直接指定zip文件的生成路径和读取路径一致,同时也要确保要打包的文件在服务器上路径正确:
from flask import Flask, send_from_directory, current_app
import zipfile
import os
import logging

@app.route('/get_files', methods=['GET'])
def download():
    # 明确指定zip文件的绝对存储路径
    zip_dir = "/home/localadmin/test"
    zip_path = os.path.join(zip_dir, 'gen.zip')
    
    # 先确认目标目录存在,不存在就创建
    if not os.path.exists(zip_dir):
        os.makedirs(zip_dir)
        logging.info(f"Created directory: {zip_dir}")
    
    zf = zipfile.ZipFile(zip_path, mode='w')
    # 这里建议用绝对路径指定要打包的文件,避免服务器上找不到
    target_files = [
        '/path/to/your/generated/file1.c',
        '/path/to/your/generated/file2.c',
        '/path/to/your/generated/file3.c',
        '/path/to/your/generated/file4.h'
    ]
    
    for file_path in target_files:
        if os.path.exists(file_path):
            # 第二个参数可以指定zip内的文件名,避免把服务器上的目录结构打包进去
            zf.write(file_path, os.path.basename(file_path))
        else:
            logging.warning(f"Warning: File {file_path} does not exist on server!")
    
    zf.close()
    logging.info(f"Zip file generated at: {zip_path}, exists: {os.path.exists(zip_path)}")
    
    return send_from_directory(zip_dir, "gen.zip", as_attachment=True)
  1. 用Flask内置路径变量:避免硬编码绝对路径,用Flask提供的root_path(应用根目录)或者instance_path来生成路径,适配不同部署环境:
zip_path = os.path.join(current_app.root_path, 'gen.zip')

另外还要确认服务器上的两个关键点:

  • /home/localadmin/test目录是否真的存在,且运行Flask的用户账号有读写权限(比如能不能在这个目录里创建文件)
  • generated/目录下的那几个c/h文件,在服务器上的实际路径是否和你代码里写的一致

二、再排查代理/服务器配置

如果路径和权限都没问题,那就要看看反向代理(比如Nginx、Apache)的配置了:

  • 确认代理是否正确转发了下载请求,有没有拦截send_from_directory返回的响应
  • 检查代理配置里有没有限制文件下载的规则,比如某些路径被重写或者拦截了
  • 如果用了Nginx,看看是否配置了alias或者root来正确映射静态文件目录

额外调试小技巧

可以在代码里加些日志,帮你确认文件生成的状态:

logging.info(f"Zip file size: {os.path.getsize(zip_path) if os.path.exists(zip_path) else 'File not found'}")

然后查看服务器上的Flask日志,就能清楚知道zip文件到底有没有生成在正确的位置了。

内容的提问来源于stack exchange,提问作者Abi-k

火山引擎 最新活动