有很多帖子都是关于这个特定的TypeError的,但没有一个对我的情况有帮助。我有一个函数,它从服务器返回一个文件,但每次我试图调用它时都会发生这个错误:
文件“services.py“,第75行,在修饰后返回f(user,*args,**kwargs)
TypeError:downloadanddelete()为参数“file”获取了多个值
我能在网上找到的都是关于类函数和覆盖位置参数的问题。
测试建议或指向有关问题的在线资源将非常感谢。
services.py 主要)
from downlaod import downlaoad
from functools import wraps
from flask import *
from flask_sqlalchemy import SQLAlchemy
from apscheduler.schedulers.background import BackgroundScheduler
# create app
app = Flask(__name__)
# config for app --> link database
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://////opt/services/databases/users.db'
db = SQLAlchemy(app)
User = database(db=db)
def auth(f):
@wraps(f)
def decorated(*args, **kwargs):
#request authorization and save data in auth
auth = request.authorization
# if auth or username or password are empty
if not auth or not auth.username or not auth.password:
return make_response('Could not verify', 401, {'WWW-Authenticate' : 'Basic realm="Login required!"'})
# find the user
user = User.query.filter_by(username=auth.username).first()
# if user is empty
if not user:
return make_response('Could not verify', 401, {'WWW-Authenticate' : 'Basic realm="Login required!"'})
# if password is not correct
if user.password != auth.password:
return make_response('Could not verify', 401, {'WWW-Authenticate' : 'Basic realm="Login required!"'})
# if password is correct
if user.password == auth.password:
# gib user zurück
return f(user, *args, **kwargs)
return decorated
@app.route('/download/<file>', methods=['GET'])
@auth
def downloadanddelete(file,current_app):
r = downlaoad(file=file,current_app=current_app)
return r
if __name__ == '__main__':
app.run(port=8081, host="127.0.0.1")
downloadanddelete.py
# import Lib
from flask import make_response, Flask, send_file
import os
def downlaod(file,current_app):
# path of temp
path = '/opt/services/temp/' + file
# generate a file in the ram than delete the file from SSD or HDD
def generate():
with open(path, "rb") as f:
yield from f
os.remove(path)
r = current_app.response_class(generate())
r.headers.set('Content-Disposition', 'attachment', file)
#send file
return r
**更新#1:**尝试在本地复制错误并使用与上面提到的完全相同的代码。我得到了一个不同的错误:
类型错误:downloadanddelete()缺少1个必需的位置参数:'当前应用程序'
我没有将current_app
传递给downloadanddelete()
,而是从flask导入它,从而使它在Windows计算机上本地工作:
Services.py 更改
@app.route('/download/<file>', methods=['GET'])
def downloadanddelete(file):
return downlaod(file=file)
downloadanddelete.py
from flask import make_response, Flask, current_app
import os
def downlaod(file):
path = 'C:\\Users\\my_username\\temp'
def generate():
with open(path, "rb") as f:
yield from f
os.remove(path)
r = current_app.response_class(generate())
r.headers.set('Content-Disposition', 'attachment', filename=file)
return r
我对服务器应用了相同的更改,并得到了与以前完全相同的错误:
文件“services.py“,第75行,在修饰后返回f(user,*args,**kwargs)
TypeError:downloadanddelete()为参数“file”获取了多个值
我目前正在尝试在本地复制错误,有什么想法吗?
1条答案
按热度按时间g0czyy6m1#
事后看来,解决方案非常简单,但代码的编写方式可能会让人困惑。
auth()
函数返回一个用户对象。因此,当你使用@app.route
和@auth
时,函数期望当前用户。如果你在调用的函数(downloadanddelete)中没有用户参数,它将在第一个位置参数中传递,这就是错误发生的原因。解决方案