Flask restfulservices
-
Upload
marcos-lin -
Category
Software
-
view
253 -
download
3
Transcript of Flask restfulservices
Flask RESTful ServicesThere is an alternative to DJango
http://flask.pocoo.org/
Who Am I?
Why Flask?
SimpleIntuitiveLoads of Extensions
Pythonic
Hello World in 3 Steps
from flask import Flask, jsonifyapp = Flask(__name__)
@app.route("/")def root(): msg = {"message": "Hello World"} return jsonify(msg)
if __name__ == "__main__": app.run()
1. Creation of the Flask App
2. Define Route
3. Return dictionary as JSON
1. Response
Simple Response
@app.route("/simple/")def return_simple(): return "I lost it", 404
Returning a Generator
@app.route("/generator/")def return_generator(): def loads_of_data(): yield "[" for i in xrange(5): if i: yield "," yield '{ "key%d": "Entry Number %d"}' % (i, i) yield "]" return Response(loads_of_data(), content_type="application/json")
Generator Function
Returning a Response
@app.route("/response/")def return_response(): msg = {"message": "I am working on that..."} msg_json = json.dumps(msg) return Response(msg_json, content_type="application/json", status=202)
class flask.Response(response=None, status=None, headers=None, mimetype=None,content_type=None, direct_passthrough=False)
Returning a File
@app.route("/file/")def return_file(): return send_file('flask_logo.png')
flask.send_file(filename_or_fp, mimetype=None, as_attachment=False,attachment_filename=None, add_etags=True, cache_timeout=None,conditional=False)
2. Routing
Dynamic Route
@app.route("/car/<make>/<model>")def car(make, model): car = { "make": make, "model": model } return jsonify(car)
Dynamic Route - Set Type
@app.route("/car/<string:make>/<int:model>")def car(make, model): car = { "make": make, "model": model } return jsonify(car)
Specify type of params
Dynamic Route - Set Default
@app.route("/car/<string:make>/<int:model>")@app.route("/car/<string:make>/", defaults={"model": 500})@app.route("/car/", defaults={"make": "Fiat", "model": 500})def car(make, model): car = { "make": make, "model": model } return jsonify(car)
REST Verbs
@app.route("/inventory/", methods=['POST'])def inventory_post(): data = request.json resp = jsonify({"idinput": data.get("id")}) resp.status_code = 201 return resp
methods allow a list of verbs
jsonify returns a Response object
Talk is Cheap...
3. Advance-ish
Static File Server
@app.route('/<path:path>')def send_app(path): return send_from_directory('www/', path)
@app.route('/')def send_app_index(): return send_from_directory('www/', 'index.html')
Database Connectionfrom flask import g
def get_db(): db = getattr(g, '_database', None) if db is None: db = g._database = connect_to_database() return db
@app.teardown_appcontextdef close_connection(exception): db = getattr(g, '_database', None) if db is not None: db.close()
http://flask.pocoo.org/docs/0.10/patterns/sqlite3/
Use Flask’s Global Object
Open connection if not connected
Close connection when request is done
Exception Handling
def restful_error_handler(ex): resp = jsonify(error_message=str(ex)) if isinstance(ex, HTTPException): resp.status_code = ex.code else: resp.status_code = 500 return resp
for code in default_exceptions.iterkeys(): app.error_handler_spec[None][code] = restful_error_handler
http://flask.pocoo.org/snippets/83/
Set Response Code
[<blueprint name>][<http code>]
Blueprint
bp = Blueprint('car', __name__)
@bp.route("/<make>/<model>"):def return_car(make, model): return jsonify({ "make": make, "model": model})
app.register_blueprint(bp, url_prefix='/car')
Create a Blueprint object
Declare route of the blueprint
Register blueprint
Putting it all together
More Info
http://flask.pocoo.org/
http://flask.pocoo.org/extensions/
http://docs.python-requests.org/en/latest/
https://github.com/marcoslin/flask-restful-into