Flask を使用して heroku でアプリを実行しており、Cloudinary アドオンを使用してイメージ管理をより簡単にしようとしています。奇妙なことに、この API では特定の画像ファイルは問題なく通過できますが、他のファイルでは「アップロードに無効な URL」というエラーが発生します。
以下はroutes.pyの私のコードです:
@app.route("/cloudinary", methods=['GET', 'POST'])
@login_required
def upload():
if 'email' not in session:
return redirect(url_for('login'))
user = User.query.filter_by(email = session['email']).first()
# Allows user to upload file into static folder
form = UploadForm()
if request.method == 'POST':
if form.validate() == False:
flash('All fields are required.')
return render_template('upload.html', form=form, user = user)
else:
file = request.files.get('photo')
if file:
if user.usertype != 'Artist' and form.checkbox.data == False:
flash('Sorry, only registered Artists can post pictures.')
return render_template('upload.html', form=form, user = user)
else:
newpic = Picture(form.name.data, None, form.caption.data, user.id)
#json_result = cloudinary.upload_image(file)
#url = json_result.get('url')
newpic.userid = user.id
newpic.name = form.name.data
json_result = cloudinary.upload_image(request.files['photo'], newpic.id)
url = json_result.get('url')
if form.checkbox.data == True:
user.profilepic = url
db.session.commit()
newpic.filename = url
newpic.caption = form.caption.data
db.session.add(newpic)
db.session.commit()
return render_template('upload.html', form = form, success=True, user = user)
elif request.method == 'GET':
filename = None
return render_template('upload.html', form=form, filename=filename, user = user)
そして、models.py の cloudinary クラスは次のとおりです。
class Cloudinary(object):
def __init__(self, app):
config = app.config['CLOUDINARY_URL'].split('://')[1]
config = config.replace("@", ":")
self.api_key, self.api_secret, self.name = config.split(":")
def upload_image(self, image, id):
keys = {'public_id': id}
res = uploader.call_api(
"upload",
uploader.build_upload_params(**keys),
api_key=self.api_key,
api_secret=self.api_secret,
cloud_name=self.name,
file=image.stream,
)
return res
500 エラーをスローした Heroku から取得したログは次のとおりです。
2014-01-12T09:09:23.700352+00:00 heroku[router]: at=info method=POST path=/cloudinary host=outlet-beta.herokuapp.com fwd="207.38.157.121" dyno=web.1 connect=1ms service=270ms status=500 bytes=291