I am trying to upload picture to database, but it gives me this error. I did it according to Youtube tutorial Also an User on stackoverflow told me about default init method, which expects keywords ...
File "/home/user/flask-crud-api/app.py", line 56, in registration
upload = pets(filename=file.name, pic=file.read())
TypeError: __init__() got an unexpected keyword argument 'filename'
Just in case, all the code is below
rom flask import Flask, request, render_template, url_for, redirect from flask_sqlalchemy import SQLAlchemy import os from config import Config from flask_migrate import Migrate
import psycopg2
app = Flask(__name__)
app.config.from_object(Config)
# NOT HARD CODING , export DB_URL needed
DB_URL = 'postgresql+psycopg2://postgres:mysecretpassword@127.0.0.1:5432/testdb'
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL #os.environ.get('DATABASE_URL')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
migrate = Migrate(app,db) #added db
class Config(object):
SECRET_KEY = 'some-secret-key'
SQLALCHEMY_DATABASE_URI = DB_URL
class pets(db.Model):
id = db.Column(db.Integer, primary_key=True)
owner_name = db.Column(db.String(100), nullable=False)
owner_age = db.Column(db.Integer, primary_key=True)
pet_name = db.Column(db.String(100), nullable=False)
pet_age = db.Column(db.Integer, primary_key=False)
pic = db.Column(db.LargeBinary) # I had this commented
# I had init func below commented, but sqlalchemy.exc.IntegrityError came up. It didn't like commit
def __init__(self, owner_name, owner_age,pet_name,pet_age,pic):#here added pic__init__
self.owner_name = owner_name
self.owner_age = owner_age
self.pet_name = pet_name
self.pet_age = pet_age
self.pic = pic # this too commented
def __repr__(self):
return '<Owner {}>'.format(self.owner_name)
db.create_all()
@app.route('/reg', methods=["POST","GET"])
def registration():
if request.method == "POST":
file = request.files["myfile"]
upload = pets(filename=file.filename, pic=file.read())
db.session.add(upload)
o_owner_name = request.form["o_name"]
n_owner_name = pets(owner_name=o_owner_name)
db.session.add(n_owner_name)
# here han't added anything
o_owner_age = request.form["o_age"]
n_owner_age = pets(owner_age=o_owner_age)
db.session.add(n_owner_age)
o_pet_name = request.form["p_name"]
n_pet_name = pets(pet_name=o_pet_name)
db.session.add(n_pet_name)
o_pet_age = request.form["p_age"]
n_pet_age = pets(pet_age=o_pet_age)
db.session.add(n_pet_age)
db.session.commit()
#return f'Uploaded: {file.filename}'
return redirect("/reg")
else:
return render_template('registration.html')
@app.route('/update/<id>', methods=['PUT'])
def update_item(id):
o_on = request.form["o_name"]
o_oa = request.form["o_age"]
o_pn = request.form["p_name"]
o_pa = request.form["o_name"]
db.session.query(pets).filter_by(id=id).update(
dict(owner_name=o_on, owner_age=o_oa, pet_name=o_pn,pet_age=o_pa))
db.session.commit()
return "item updated"
@app.route('/table', methods=["GET"])
def table():
animals = pets.query.all()
return render_template('table.html', pets=animals) #error was loc variable pets assigned before use, then changed to animals.
#@app.route('/pets/<id>', methods=['DELETE'])
#def delete_item(id):
# db.session.query(pets).filter_by(id=id).delete()
#db.session.commit()
#return "item deleted"
if __name__ == '__main__':
app.run(debug=True)