【问题标题】:Flask route to download .xml files leading to 404 Not FoundFlask 路径下载导致 404 Not Found 的 .xml 文件
【发布时间】:2016-04-27 12:39:51
【问题描述】:

我有一个在Debian Jessie VPS 上运行并由nginx (1.6.2) 提供支持的flask (0.10.1) 应用程序。该应用程序运行良好,但我最近添加的特定 route 有问题。

route 用于下载.xml 文件。

动态告诉目录和文件名:

@app.route('/backups/<dir_key>/<filename>')

并根据flasksend_from_directory函数注册一个函数:

def backups(dir_key,filename):
    directory = os.path.join(app.config['BACKUPXML_FOLDER'], dir_key)
    return send_from_directory(directory, filename, as_attachment=True)

通过flaskurl_for函数生成路由,并返回到前端:

return jsonify({
    'backupFileUrl': url_for('backups', dir_key=dir_key, filename = filename, _external=True)
})

它存储在AngularJS 变量中的位置:

$scope.backupFileUrl = response.backupFileUrl;

最后包含在&lt;a&gt; 标记中以供下载:

<a class="btn btn-primary"
   ng-show="sessionDownload"
   ng-href="{{ backupFileUrl }}" target="_blank">
   <span class="glyphicon glyphicon-save"></span> Télécharger </a>

但是当我点击按钮时,我得到以下错误:

奇怪的是:

  1. 当应用由本地 Windows 机器上的小型 Python 服务器驱动时,下载会正确触发。
  2. 我有一个route 用于下载实际工作的.xlsx 文件,并且在本地Windows 机器和Jessie VPS 上都可以。

有人知道我如何定义route 以使其工作吗?

如果需要,这里是 api 架构:

api/app.py

import sys
sys.path.append('../')

from flask_script import Server, Manager
from kosapp import app, db

manager = Manager(app)

if __name__ == '__main__':    
    manager.run()

api/config.py

from os.path import abspath, dirname, join
import tempfile

basedir = dirname(abspath(__file__))
BASEDIR = dirname(abspath(__file__))

DEBUG = True

REPORTS_FOLDER = '/tmp/reports'
# on local machine 
# REPORTS_FOLDER = os.path.join(tempfile.gettempdir(), 'reports') 

BACKUPXML_FOLDER = '/tmp/backups'
# on local machine
# BACKUPXML_FOLDER = os.path.join(tempfile.gettempdir(), 'backups')

api/kosapp/__init__.py

from flask import Flask

app = Flask(__name__)
app.url_map.strict_slashes = False
app.config.from_object('config')

from kosapp import views

api/kosapp/views.py

import os

from flask import send_file, jsonify, request, render_template, send_from_directory

from kosapp import app

@app.route('/reports/<dir_key>/<filename>')
def reports(dir_key, filename):
    directory = os.path.join(app.config['REPORTS_FOLDER'], dir_key)
    return send_from_directory(directory, filename)

@app.route('/backups/<dir_key>/<filename>')
def backups(dir_key,filename):
    directory = os.path.join(app.config['BACKUPXML_FOLDER'], dir_key)
    return send_from_directory(directory, filename, as_attachment=True)

请注意,路由'/reports/&lt;dir_key&gt;/&lt;filename&gt;' 用于下载.xlsx 文件并且工作正常。

【问题讨论】:

  • 为什么不让 Nginx 为您提供文件?
  • 你的意思是直接指向&lt;a&gt;标签中的文件吗?
  • 您正在使用 Flask 提供来自特定文件夹的文件。 Nginx 会做得更好。您可以设置别名或位置来匹配您需要匹配的前缀。
  • 您的评论让我对 Nginx 配置有了一点了解(我没有这样做),我认为问题在于 etc/nginx/sites-enabled/default 文件的定义。我应该将backups 添加到location ~ ^/(api|auth|me|reports) 行。我会试一试,并提供最新情况。谢谢!

标签: python angularjs nginx flask debian


【解决方案1】:

您还记得在服务器上重新加载应用程序吗?如果我在开发计算机和 Web 服务器上得到不同的结果,这通常就是问题所在。

例如,如果您使用gunicorn 进行部署,则必须重新启动gunicorn,以便服务器知道您的代码所做的更改。

【讨论】:

  • 谢谢。是的,我重新启动了应用程序。
猜你喜欢
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多