config.py
import os
class Config:
SQLALCHEMY_TRACK_MODIFICATIONS = False
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = os.getenv("DEV_DATABASE_URL")
class TestingConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = os.getenv("TEST_DATABASE_URL")
class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI = os.getenv("DATABASE_URL")
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
bookshop.py
from app import db
from app.routes import app
from app.models import Book
@app.shell_context_processor
def make_shell_context():
return dict(db=db, Book=Book)
app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import config
db = SQLAlchemy()
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
db.init_app(app)
return app
app/models.py
from . import db
class Book(db.Model):
__tablename__ = 'books'
isbn = db.Column(db.Integer, primary_key=True)
author = db.Column(db.String(100), nullable=False)
title = db.Column(db.String(100), nullable=False)
price = db.Column(db.Float)
def to_json(self):
return {
'isbn': self.isbn,
'author': self.author,
'title': self.title,
'price': self.price
}
app/routes.py
import os
from . import create_app
from .models import Book
from . import db
from flask import jsonify, request, abort
app = create_app(os.getenv('FLASK_CONFIG') or 'default')
@app.route("/book/list", methods=["GET"])
def get_books():
books = Book.query.all()
return jsonify([book.to_json() for book in books])
@app.route("/book/<int:isbn>", methods=["GET"])
def get_book(isbn):
book = Book.query.get(isbn)
if book is None:
abort(404)
return jsonify(book.to_json())
@app.route("/book/<int:isbn>", methods=["DELETE"])
def delete_book(isbn):
book = Book.query.get(isbn)
if book is None:
abort(404)
db.session.delete(book)
db.session.commit()
return jsonify({'result': True})
@app.route('/book', methods=['POST'])
def create_book():
if not request.json:
abort(400)
book = Book(
title=request.json.get('title'),
author=request.json.get('author'),
price=request.json.get('price')
)
db.session.add(book)
db.session.commit()
return jsonify(book.to_json()), 201
@app.route('/book/<int:isbn>', methods=['PUT'])
def update_book(isbn):
if not request.json:
abort(400)
book = Book.query.get(isbn)
if book is None:
abort(404)
book.title = request.json.get('title', book.title)
book.author = request.json.get('author', book.author)
book.price = request.json.get('price', book.price)
db.session.commit()
return jsonify(book.to_json())