python - Flask & Boto3 `ValueError: Required parameter name not set` 访问资源

标签 python amazon-web-services amazon-s3 flask

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

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)

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

最佳答案

Boto3 允许 3 种方式来设置凭据,已记录 here .

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

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

问题是,您没有使用 s3 变量(存储 boto3 客户端)来访问您的资源。此方法创建一个“低级客户端”,用于非常特定地访问您的 S3 资源。所以如果这是你的意图,read the docs on the Client class here .

否则,您可以让 Boto 从环境变量中读取,like in this method here ,然后像上面那样继续访问您的资源。

您必须设置以下环境变量,可能在您的本地主机上的 ~/.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!

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

关于python - Flask & Boto3 `ValueError: Required parameter name not set` 访问资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51716222/

相关文章:

python - 在导入命令中使用变量

python - Pandas 使用数据框中的两列应用函数来创建一个新列

python - 如何从 gensim 模型中的 Doc2Vec 相似度分数访问文档详细信息?

android - 在 Android 上本地保存来自 DynamoDB 的数据

python - boto3 S3 对象解析

python - 如何使用 Numpy 生成随机 N 维?

java - 从 Java 客户端调用 lambda 函数后如何访问 lambda 函数调用的云监视日志

java - 新手 : query amazon s3 database in Android client (Java)

ruby - 如何使用 Ruby Base64 模块对哈希进行编码

node.js - 解压 .zip,然后使用 Node.js 将内容存储在 S3 中