访问资源时 Flask 和 Boto3 `ValueError: Required parameter name not set`

Mik*_*ton 8 python amazon-s3 amazon-web-services flask

每次我运行我的应用程序时,它都会工作,直到我向/files路由发送请求,在那里我得到一个ValueError: Required parameter name not set. 该错误未指定parameter未设置的内容。

from flask import (
    Flask, render_template, redirect, 
    url_for, g, session, flash, request
)
from flask_session import Session
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm
from flask_wtf.file import FileField
from datetime import datetime
from wtforms import StringField, PasswordField, BooleanField, DateTimeField, TextField
from wtforms.validators import InputRequired, Email, Length
from flask_sqlalchemy  import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import (LoginManager, UserMixin, login_user,
                         login_required, logout_user, current_user)
from werkzeug.utils import secure_filename
from flask_s3 import FlaskS3
import boto3
from config import S3_BUCKET, S3_KEY, S3_SECRET

s3 = boto3.client(
    "s3",
    aws_access_key_id=S3_KEY,
    aws_secret_access_key=S3_SECRET
)

app = Flask(__name__)
app.config['FLASKS3_BUCKET_NAME'] = 'flaskprofileproject'
app.config['SECRET_KEY'] = "ASNDASNDASONDSAOIDMAODNAS"
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:////Users/michaelaronian/Desktop/FlaskProject/database.db"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
bootstrap = Bootstrap(app)
db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.init_app(app)
login_manager.login_view = 'login'

# Code removed for brevity's sake

@app.route('/files')
def files():
    s3_resource = boto3.resource('s3')
    my_bucket = s3_resource.Bucket(S3_BUCKET)
    summaries = my_bucket.objects.all()

    return render_template('files.html', my_bucket=my_bucket, files=summaries)

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=4100)
Run Code Online (Sandbox Code Playgroud)

我的应用程序的其余部分运行良好。感谢您的帮助。

The*_*inn 6

Boto3 允许 3 种设置凭据的方法,记录在此处

看起来您正在使用上面链接的方法参数的第三种方法:

s3 = boto3.client(
    "s3",
    aws_access_key_id=S3_KEY,
    aws_secret_access_key=S3_SECRET
)
Run Code Online (Sandbox Code Playgroud)

问题是,您没有使用s3变量(存储 boto3 客户端)来访问您的资源。此方法创建一个“低级客户端”,用于对 S3 资源进行非常具体的访问。因此,如果这是您的意图,请阅读此处的课程文档Client

否则,您可以Boto从环境变量中读取数据,就像这里的方法一样,然后按照上面的操作访问您的资源。

您必须设置以下环境变量(可能在~/.bash_profile本地主机上),以便boto3知道如何连接到您的 AWS S3 存储桶。在您的 中~/.bash_profile,添加:

export AWS_ACCESS_KEY_ID="The access key for your AWS account."
export AWS_SECRET_ACCESS_KEY="The secret key for your AWS account."
export AWS_SESSION_TOKEN="The session key for your AWS account."
# This is only needed when you are using temporary credentials, so you can probably ignore it!
Run Code Online (Sandbox Code Playgroud)

编辑此文件后,保存它,然后运行 ​​asource ~/.bash_profile将新的环境变量导出到您的环境中(在启动服务器的同一 shell 中),然后启动服务器。