1、Restful的介绍
Flask-RESTful是用于快速构建REST API的Flask扩展。
1.1 Restful接口规范
REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。
RESTful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次。
RESTful接口规范是用于在前端与后台进行通信的一套规范。使用这个规范可以让前后端开发变得更加轻松。
1.2 Restful使用协议
用http或者https协议。
1.3 数据传输格式
数据传输的格式应该都用json格式。
1.4 适用场景
一个系统的数据库数据,展现的平台有PC端、移动端、app端、ios端。
- 前端工程师:都遵循RESTful编程规范
- 后端工程师:都遵循RESTful编程规范
- 最终结果:开发效率高,便于管理
1.5 url链接规则
url链接中,不能有动词,只能有名词。
并且对于一些名词,如果出现复数,那么应该在后面加s。
比如:获取新闻列表,应该使用 /news/ ,而不应该使用/get_news/
1.6 HTTP请求方式
- GET:从服务器上获取资源。
- POST:在服务器上新增或者修改一个资源。
- PUT:在服务器上更新资源。(客户端提供所有改变后的数据)
- PATCH:在服务器上更新资源。(客户端只提供需要改变的属性)
- DELETE:从服务器上删除资源。
1.7 状态码
2、Restful基本使用
2.1 优缺点
优势:
- Flask-Restful是一个专门用来写restful api的一个插件。
- 使用它可以快速的集成restful api接口功能。
- 在系统的纯api的后台中,这个插件可以帮助我们节省很多时间。
缺点:
- 如果在普通的网站中,这个插件就没有优势了,因为在普通的网站开发中,是需要去渲染HTML代码的,而Flask-Restful在每个请求中都是返回json格式的数据。
2.2 安装
pip install flask-restful
2.3 基本使用
定义Restful的类视图:
1. 从 flask_restful 中导入 Api ,来创建一个 api 对象。
2. 写一个类视图,让他继承自 Resource 类,然后在这个里面,使用你想要的请求方式来定义相应的方法,比如你想要将这个类视图只能采用 post 请求,那么就定义一个 post 方法。
3. 使用 api.add_resource 来添加类视图与 url 。
注意:
- 如果你想返回json数据,那么就使用flask_restful,如果你是想渲染模版,那么还是采用之前的方式,就是 app.route 的方式。
- url还是跟之前的一样,可以传递参数。也跟之前的不一样,可以指定多个url。
- endpoint是用来给url_for反转url的时候指定的。如果不写endpoint,那么将会使用视图的名字的小写来作为endpoint。
- add_resource的第二个参数是访问这个视图函数的url,这个url可以跟之前的route一样,可以传递参数,并且还有一点不同的是,这个方法可以传递多个url来指定这个视图函数。
示例代码1:
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorldResource(Resource):
def get(self):
return {'hello': 'world'}
def post(self):
return {'msg': 'post hello world'}
api.add_resource(HelloWorldResource, '/')
if __name__ == '__main__':
app.run(debug=True)
运行结果:
示例代码2:
from flask import Flask, url_for
from flask_restful import Resource, Api
app = Flask(__name__)
# 建立Api对象,并绑定应用APP
api = Api(app)
class LoginView(Resource):
def get(self):
return {"flag": True}
def post(self):
return {"flag": False}
# # 建立路由映射
# api.add_resource(LoginView, '/login/')
#
# with app.test_request_context():
# # werkzeug.routing.BuildError: Could not build url for endpoint 'login'. Did you mean 'loginview' instead?
# # 默认没有写endpoint反向url_for函数通过小写函数名
# # 如果有多个url,会返回第1个URL
# # print(url_for('loginview'))
# print(url_for('login'))
# 建立路由映射
api.add_resource(LoginView, '/login/', '/login2/', endpoint='login')
with app.test_request_context():
# 默认没有写endpoint反向url_for函数, 通过小写函数名实现
# 如果有多个url,会返回第1个URL
# print(url_for('loginview'))
print(url_for('login'))
if __name__ == '__main__':
app.run(debug=True)
运行结果:
示例代码3:
from flask import Flask, url_for
from flask_restful import Resource, Api
app = Flask(__name__)
# 建立Api对象,并绑定应用APP
api = Api(app)
class LoginView(Resource):
def get(self):
return {"flag": True}
def post(self):
return {"flag": False}
class Loginview(Resource):
def get(self):
return {"flag2": True}
def post(self):
return {"flag2": False}
# 建立路由映射
# api.add_resource(LoginView, '/login/', '/login2/', endpoint='login')
api.add_resource(LoginView, '/login/', '/login2/')
# api.add_resource(Loginview, '/login_lower/', '/login2_lower/', endpoint='login2')
api.add_resource(Loginview, '/login_lower/', '/login2_lower/')
if __name__ == '__main__':
app.run(debug=True)
运行结果:
注意:使用视图函数时,类名.lower()的值不能相同。