UD - FLASK - REST
Last updated
Was this helpful?
Last updated
Was this helpful?
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello World!'
app.run(port=5000)
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'})
# 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