Python
  • index
  • Basic - 1
  • Basic - 2
  • SQLAlchemy
  • Decorator
  • @property
  • __dict__
  • pathlib
  • class
  • flask
  • Jupyter Notebook
  • PyQt
  • UD - FLASK - PY Basic
  • UD - FLASK - REST
  • UD - FLASK - vanilla SQL
  • UD - FLASK - SQLAlchemy
  • UD - FLASK - JWT
  • UD - FLASK - Serialization
Powered by GitBook
On this page
  • 1. Core
  • 2. Basic REST api
  • 3. Flask-RESTful

Was this helpful?

UD - FLASK - REST

PreviousUD - FLASK - PY BasicNextUD - FLASK - vanilla SQL

Last updated 5 years ago

Was this helpful?

1. Core

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
  return 'Hello World!'

app.run(port=5000)

2. Basic REST api

JSON will be sent as string.

from flask import jsonify

stores = [{
    'name': 'My Store',
    'items': [{'name':'my item', 'price': 15.99 }]
}]


@app.route('/store' , methods=['POST'])
def create_store():
  request_data = request.get_json()
  new_store = {
    'name':request_data['name'],
    'items':[]
  }
  stores.append(new_store)
  return jsonify({'store': new_store})


@app.route('/store/<string:name>')
def get_store(name):
  for store in stores:
    if store['name'] == name:
          return jsonify({'store': store})
  return jsonify ({'message': 'store not found'})


@app.route('/store')
def get_stores():
  return jsonify({'stores': stores})


@app.route('/store/<string:name>/item' , methods=['POST'])
def create_item_in_store(name):
  request_data = request.get_json()
  for store in stores:
    if store['name'] == name:
        new_item = {
            'name': request_data['name'],
            'price': request_data['price']
        }
        store['items'].append(new_item)
        return jsonify({'store': store})
  return jsonify ({'message' :'store not found'})


@app.route('/store/<string:name>/item')
def get_item_in_store(name):
  for store in stores:
    if store['name'] == name:
        return jsonify( {'items': store['items']} )
  return jsonify ({'message':'store not found'})

3. Flask-RESTful

# filter(lambda, arr) -> return list of matchings
# next(func, None) # next return the 1st result or default None
matched_items = filter(lambda x: x['name'] == name, items)
item = next(matched_items, None)

inheritance from Resource to use handy methods.

from flask import Flask, request
from flask_restful import Resource, Api, reqparse

app = Flask(__name__)
api = Api(app)

items = []

class Item(Resource):
    parser = reqparse.RequestParser()
    parser.add_argument('price',
        type=float,
        required=True,
        help="This field cannot be left blank!"
    )

    def get(self, name):
        item = next(filter(lambda x: x['name'] == name, items), None)
        return {'item': item}, 200

    def post(self, name):
        if next(filter(lambda x: x['name'] == name, items), None):
            return {'message': "An item with name '{}' already exists.".format(name)}, 404

        data = Item.parser.parse_args()
        item = {'name': name, 'price': data['price']}
        items.append(item)
        return item, 201

    def delete(self, name):
        global items  # overwrite global in local scope!!!
        items = list(filter(lambda x: x['name'] != name, items))
        return {'message': 'Item deleted'}, 200

    def put(self, name):
        data = Item.parser.parse_args()
        item = next(filter(lambda x: x['name'] == name, items), None)
        if not item:
            item = {'name': name, 'price': data['price']}
            items.append(item)
        else:
            item.update(data) # update all params from data is dangerous, and we need parser to whitelist.
        return item, 200

class ItemList(Resource):
    def get(self):
        return {'items': items}, 200

api.add_resource(Item, '/item/<string:name>')
api.add_resource(ItemList, '/items')

if __name__ == '__main__':
    app.run(debug=True)  # important to mention debug=True
https://arac.tecladocode.com/