The Flask tutorial site here says that to create a RESTful API, you would write classes that extend restful.Resource
, then add them to the API by:
app = Flask(__name__)
api = restful.Api(app)
class HelloWorld(restful.Resource):
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
However, I've looked at quite a few tutorials that all just use functions with the @app.route('/path')
decorator that I'm more used to seeing in Flask apps. For example, here, they have:
@app.route('/todo/api/v1.0/tasks', methods=['GET'])
def get_tasks():
return jsonify({'tasks': tasks})
And here:
@app.route('/')
def api_root():
return 'Welcome'
What's the difference between using the restful.Resource
class and just the decorated functions if any? If there are no differences, what should I be doing by convention to create a RESTful API?
Short answer:
restful.Resource is from a Flask-Restful extension, which is not Flask itself. Miguel's tutorial uses Flask to write a restful interface.
Long answer:
First of all, along with Flask, there are a number of Flask extensions. Although they work together, they are separate packages and are written by individual authors. Flask-Restful is an extension to Flask.
Miguel's tutorial explains how you can make a restful api using Flask by itself.
Flask-Restful with the aim to saving some of us from re-inventing the wheel, promises to turn a custom class(or a custom Python data structure) to a restful web service. Flask-RESTX, a fork of Flask-Restful, auto-generates api documentation with swagger UI.
In addition, Flask also documented the usage of MethodView to allow developers to write their own restful APIs. In parallel, Flask-Restless promises to turn a SqlAlchemy class into a restful web service.
An update(18/07/2016), flask-api turns a function/view into a restful interface and is designed by Tom Christie, the author of django restful framework.
There are many roads to Roma.
Using methods instead of classes can quickly become confusing when lots of endpoints are needed. Classes/resource are a better way of separating and decoupling logic. Plus your code becomes much more readable and easier to change/fix
Using flask-restful is probably the best way, although I will have some work to do in order to create the blueprint for your api, configuring routing, handling the request parameters, and many things that every normal api needs, that gets quite annoying.
I have built this lightweight framework on top of flask-restful that lets you build restful apis easily without worrying about all the wiring needed, and just focus on defining your api and coding the business logic. You can check it out here: https://github.com/sebastiandev/peach
It is more oriented to NOSQL databases, but thats only because the proxy for the database that comes as default is for mongodb, if you need sql, you can just make a proxy for sqlachemy (or wait until i find time to build it).
#from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "Hello, World!"
if __name__ == '__main__':
app.run(debug=True)
Setup:
1:create app.py file.
2: pip3 install flask.
Code:
import flask
app=flask.Flask(__name__)
app.config["DEBUG"]=True
@app.route('/',methods=['GET'])
def home():
return "hello"
app.run()
Run:
python app.py