flask application example
this is my app.py file
!/usr/bin/env python3
import os BASE_DIR = os.path.abspath(os.path.dirname(file)) DATABASE = os.environ.get("DB_URI", f"sqlite:///{os.path.join(BASE_DIR, 'instance/app.db')}")
from flask import Flask, request from flask_migrate import Migrate
from models import db, Activity, Signup, Camper
app = Flask(name) app.config['SQLALCHEMY_DATABASE_URI'] = DATABASE app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.json.compact = False
migrate = Migrate(app, db)
db.init_app(app)
@app.route('/') def home(): return ''
@app.route('/campers', methods=['GET', 'POST']) def campers(): if request.method == 'GET': return [camper.to_dict(rules=('-activities', '-signups')) for camper in Camper.query.all()] elif request.method == 'POST': fields = request.get_json() try: camper = Camper( name=fields.get('name'), age=fields.get('age') ) db.session.add(camper) db.session.commit() return camper.to_dict() except ValueError: return {'error': '400: Validation error'}, 400
@app.route('/campers/', methods=['GET']) def camper_by_id(id): camper = Camper.query.filter(Camper.id == id).one_or_none() if camper: return camper.to_dict() return {'error': '404: Camper not found'}, 404
@app.route('/activities', methods=['GET']) def activities(): return [activity.to_dict(rules=('-campers', '-signups')) for activity in Activity.query.all()]
@app.route('/activities/', methods=['DELETE']) def activity_by_id(id): activity = Activity.query.filter(Activity.id == id).one_or_none() if activity: db.session.delete(activity) db.session.commit() return {}, 204 return {'error': '404: Activity not found'}, 404
@app.route('/signups', methods=['POST']) def signups(): fields = request.get_json() try: signup = Signup( time=fields.get('time'), camper_id=fields.get('camper_id'), activity_id=fields.get('activity_id') ) db.session.add(signup) db.session.commit() return signup.to_dict() except ValueError: return {'error': '400: Validation error'}, 400
if name == 'main': app.run(port=5555, debug=True)
// my models.py file
from flask_sqlalchemy import SQLAlchemy from sqlalchemy import MetaData from sqlalchemy.orm import validates from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy_serializer import SerializerMixin
convention = { "ix": "ix_%(column_0_label)s", "uq": "uq_%(table_name)s_%(column_0_name)s", "ck": "ck_%(table_name)s_%(constraint_name)s", "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", "pk": "pk_%(table_name)s" }
metadata = MetaData(naming_convention=convention)
db = SQLAlchemy(metadata=metadata)
class Activity(db.Model, SerializerMixin): tablename = 'activities'serialize_rules = ('-campers.activities', '-signups.activity') id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) difficulty = db.Column(db.Integer) signups = db.relationship('Signup', backref='activity') campers = association_proxy('signups', 'camper', creator=lambda cmp: Signup(camper=cmp))
class Signup(db.Model, SerializerMixin): tablename = 'signups'serialize_rules = ('-activity.signups', '-camper.signups') id = db.Column(db.Integer, primary_key=True) time= db.Column(db.Integer) camper_id = db.Column(db.Integer, db.ForeignKey('campers.id')) activity_id = db.Column(db.Integer, db.ForeignKey('activities.id')) @validates('time') def validate_time(self, key, time): if 0 <= time <= 23: return time raise ValueError('Time must be integer between 0 and 23.')
class Camper(db.Model, SerializerMixin): tablename = 'campers'serialize_rules = ('-activities.campers', '-signups.camper') id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String, nullable=False) age = db.Column(db.Integer) signups = db.relationship('Signup', backref='camper') activities = association_proxy('signups', 'activity', creator=lambda act: Signup(activity=act)) @validates('name') def validate_name(self, key, name): if name: return name raise ValueError('Camper must have name.') @validates('age') def validate_age(self, key, age): if 8 <= age <= 18: return age raise ValueError('Camper must be between 8 and 18 years old.')
















