Flask
为 RESTful APIs
提供了一种简易的实现方式,可以针对不同的HTTP方法提供不同的函数。使用也很简单,只需要继承 flask.views.MethodView
然后重写需要的方法:GET POST PUT
等。
下面是官方给的程序示例:
from flask.views import MethodView
class UserAPI(MethodView):
def get(self):
users = User.query.all()
...
def post(self):
user = User.from_form_data(request.form)
...
app.add_url_rule('/users/', view_func=UserAPI.as_view('users'))
最下面的 add_url_rule
是添加路由,和用装饰器的效果一样:
@app.route('/users/')
def users(page):
users = User.query.all()
return render_template('users.html', users=users)
因为现在是视图类而不是视图函数,对类进行装饰器操作没有意义,如果想对视图函数添加装饰器,比如用户登陆检测,可以对 .as_view()
返回的函数进行装饰:
def user_required(f):
"""Checks whether user is logged in or raises error 401."""
def decorator(*args, **kwargs):
if not g.user:
abort(401)
return f(*args, **kwargs)
return decorator
view = user_required(UserAPI.as_view('users'))
app.add_url_rule('/users/', view_func=view)
如何应对多种请求方法,比如用户信息管理:
URL | Method | Description |
---|---|---|
/users/ | GET | Gives a list of all users |
/users/ | POST | Creates a new user |
/users/id | GET | Shows a single user |
/users/id | PUT | Updates a single user |
/users/id | DELETE | Deletes a single user |
官方给的实用小例子:
class UserAPI(MethodView):
def get(self, user_id):
if user_id is None:
# return a list of users
pass
else:
# expose a single user
pass
def post(self):
# create a new user
pass
def delete(self, user_id):
# delete a single user
pass
def put(self, user_id):
# update a single user
pass
user_view = UserAPI.as_view('user_api')
app.add_url_rule('/users/', defaults={'user_id': None},
view_func=user_view, methods=['GET',])
app.add_url_rule('/users/', view_func=user_view, methods=['POST',])
app.add_url_rule('/users/<int:user_id>', view_func=user_view,
methods=['GET', 'PUT', 'DELETE'])