运行时错误:无法在请求外访问配置

19 投票
1 回答
5236 浏览
提问于 2025-04-18 06:30

我遇到了以下错误:

RuntimeError: cannot access configuration outside request

这个错误是因为我执行了以下代码:

# -*- coding: utf-8 -*-

from flask import Flask, request, render_template, redirect, url_for
from flaskext.uploads import UploadSet, configure_uploads, patch_request_class

app = Flask(__name__)
csvfiles = UploadSet('csvfiles', 'csv', "/var/uploads")

@app.route("/")
def index():
    return "Hello World!"

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST' and 'csvfile' in request.files:
        filename = csvfiles.save(request.files['csvfile']) # the error occurs here!
        return redirect(url_for('index'))
    return render_template('upload.html')

if __name__ == "__main__":
    app.run(debug=True)

我不太明白这个错误信息的意思,也不知道该怎么解决这个问题。我看了官方文档,似乎需要做一些配置(比如上传文件存放的位置),但我不知道该怎么正确地设置。

我正在使用 Flask-Uploads 这个扩展。

这个程序是在一个 Python 2.7 的虚拟环境中运行的,安装了以下软件包:

Flask==0.10.1
Flask-Uploads==0.1.3
Jinja2==2.7.2
MarkupSafe==0.23
Werkzeug==0.9.4
argparse==1.2.1
itsdangerous==0.24
wsgiref==0.1.2

1 个回答

26

你还没有配置Flask-Uploads这个扩展。你需要使用configure_uploads()函数来把你的上传集合连接到你的应用上:

from flaskext.uploads import UploadSet, configure_uploads

app = Flask(__name__)
app.config['UPLOADED_CSVFILES_DEST'] = '/var/uploads'
csvfiles = UploadSet('csvfiles', ('csv',))
configure_uploads(app, (csvfiles,))

UploadSet()的第二个参数中,你需要传入一个扩展名的列表。不要把文件路径传给UploadSet;你应该使用你的Flask配置来处理。

设置UPLOADED_<你的集合名称>_DEST,其中名称要用大写字母。在这里就是UPLOADED_CSVFILES_DEST。你也可以设置一个UPLOADS_DEFAULT_DEST配置;这个配置会作为基础目录,每个集合名称会有单独的子目录。

另外,第三个参数可以是一个可调用的对象:

configure_uploads(app, (csvfiles,), lambda app: '/var/uploads')

撰写回答