【发布时间】: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;
最后包含在<a> 标记中以供下载:
<a class="btn btn-primary"
ng-show="sessionDownload"
ng-href="{{ backupFileUrl }}" target="_blank">
<span class="glyphicon glyphicon-save"></span> Télécharger </a>
但是当我点击按钮时,我得到以下错误:
奇怪的是:
- 当应用由本地
Windows机器上的小型Python服务器驱动时,下载会正确触发。 - 我有一个
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/<dir_key>/<filename>' 用于下载.xlsx 文件并且工作正常。
【问题讨论】:
-
为什么不让 Nginx 为您提供文件?
-
你的意思是直接指向
<a>标签中的文件吗? -
您正在使用 Flask 提供来自特定文件夹的文件。 Nginx 会做得更好。您可以设置别名或位置来匹配您需要匹配的前缀。
-
您的评论让我对 Nginx 配置有了一点了解(我没有这样做),我认为问题在于
etc/nginx/sites-enabled/default文件的定义。我应该将backups添加到location ~ ^/(api|auth|me|reports)行。我会试一试,并提供最新情况。谢谢!
标签: python angularjs nginx flask debian