Here are all 3 files https://gitlab.com/flask-api1/stack_public
I have online form, where you enter names, ages and upload picture. I am running Postgresql docker database and I want to write this info into database.
from 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
from dotenv import load_dotenv
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)
this is my code, which renders registration form, and after submit I have error and the base is empty.
After trying lots of things, this is the latests error. enter image description here
TypeError
TypeError: __init__() got an unexpected keyword argument 'filename'
Traceback (most recent call last)
File "/home/user/flask-crud-api/venv/lib/python3.6/site-packages/flask/app.py", line 2091, in __call__
return self.wsgi_app(environ, start_response)
File "/home/user/flask-crud-api/venv/lib/python3.6/site-packages/flask/app.py", line 2076, in wsgi_app
response = self.handle_exception(e)
File "/home/user/flask-crud-api/venv/lib/python3.6/site-packages/flask/app.py", line 2073, in wsgi_app
response = self.full_dispatch_request()
File "/home/user/flask-crud-api/venv/lib/python3.6/site-packages/flask/app.py", line 1518, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/user/flask-crud-api/venv/lib/python3.6/site-packages/flask/app.py", line 1516, in full_dispatch_request
rv = self.dispatch_request()
File "/home/user/flask-crud-api/venv/lib/python3.6/site-packages/flask/app.py", line 1502, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
File "/home/user/flask-crud-api/app.py", line 56, in registration
upload = pets(filename=file.filename, pic=file.read())
TypeError: __init__() got an unexpected keyword argument 'filename'
**I then tryed to comment out this file upload section, nd another error came up.
File "/home/user/flask-crud-api/app.py", line 60, in registration
n_owner_name = pets(owner_name=o_owner_name)
TypeError: init() missing 4 required positional arguments: 'owner_age', 'pet_name', 'pet_age', and 'pic'