一、前言
为了让有django或其他python web框架开发经验的同学快速上手flask接口开发,所以有了写这篇文章的想法。本文不会讲理论知识,一切以实用、快速上手为主。
注意:文本只讲前后端分离的接口开发。
二、flask环境准备
1.pip install flask
Flask 是一个轻量级 Web 应用程序框架,用来写接口再合适不过了。
官网:https://flask.palletsprojects.com/en/1.1.x/
2.pip install flask-login
flask的登录鉴权操作一般都是用flask-login模块,我们就不必再造这个轮子了。
官网:https://flask-login.readthedocs.io/en/latest/
3.pip install flask-restful
flask-restful是用于快速构建restful api的框架,相当于django的drf。
官网:http://www.pythondoc.com/Flask-RESTful/index.html
4.pip install sqlalchemy
非常灵活强大的ORM框架
官网:https://www.sqlalchemy.org/
5.pip install flask-sqlalchemy
为了在flask中更方便的使用sqlalchemy,对其进行了轻量级封装
官网:https://flask-sqlalchemy.palletsprojects.com/en/2.x/
三、快速上手
1.HelloWorld
在项目中新建一个main.py,做为程序的入口
from flask import Flask
from flask_restful import Resource, Api
# 创建Flask应用
app = Flask(__name__)
# 使用flask_restful创建api对象,用于注册路由
api = Api(app)
# 编写类视图
class HelloWorldView(Resource):
def get(self):
return "HelloWorld"
# 注册路由
api.add_resource(HelloWorldView, r"/hello")
if __name__ == '__main__':
app.run(port=8716, host='0.0.0.0')
2.接收参数
1.接收url中的参数,/hello?name=狡猾的皮球&age=24
from flask import Flask, request
from flask_restful import Resource, Api
# 创建Flask应用
app = Flask(__name__)
# 使用flask_restful创建api对象,用于注册路由
api = Api(app)
# 编写类视图
class HelloWorldView(Resource):
def get(self):
name = request.args.get("name")
age = request.args.get("age")
gender = request.args.get("gender", default="默认值")
print(name, age, gender)
return "HelloWorld"
# 注册路由
api.add_resource(HelloWorldView, r"/hello")
if __name__ == '__main__':
app.run(port=8716, host='0.0.0.0')
运行结果:
2.接收post请求application/json类型的json参数:
# 其他代码略
class HelloWorldView(Resource):
def get(self):
# 代码略...
def post(self):
name = request.json.get("name")
age = request.json.get("age")
gender = request.json.get("gender")
return f"Post请求接收的参数,name:{name},age:{age},gender:{gender}"
请求结果:
3.返回json类型给前端
class HelloWorldView(Resource):
def get(self):
# 代码略...
def post(self):
name = request.json.get("name")
age = request.json.get("age")
gender = request.json.get("gender")
return {
"code": 200,
"msg": "请求成功",
"data": {
"name": name,
"age": age,
"gender": gender
}
}
请求结果:
4.配置文件的加载
使用 app.config.from_object("configs") ,flask会将同级目录下的configs.py文件当做配置文件。
配置文件的大致结构configs.py(具体配置项请看flask官方文档):
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# debug 模式
DEBUG = True
# 数据库
SQLALCHEMY_DATABASE_URI = ""
# 其他数据库
SQLALCHEMY_BINDS = ""
SQLALCHEMY_TRACK_MODIFICATIONS = True
# SQLALCHEMY_ECHO=True
# REDIS配置
REDIS_CFG = ""
# 接口不返回ascii
RESTFUL_JSON = dict(ensure_ascii=False)
在项目中引用配置,比如获取DEBUG的值:
app.config.get("DEBUG")
5.数据的增删改查(简单演示)
使用flask_sqlalchemy进行数据库操作,需要先做以下几件事情:
1.在配置文件configs.py中配置数据库的连接参数,例如:
SQLALCHEMY_DATABASE_URI="mysql://用户名:密码@127.0.0.1:3306/数据库名"
2.编写model类,假如现有student表:
# 编写model
class Student(db.Model):
"""
学生表
"""
__tablename__ = 'student'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text) # 姓名
gender = db.Column(db.Integer) # 性别
查询所有学生:
if __name__ == '__main__':
# 查询所有学生
students = Student.query.all()
for student in students:
print(student.name)
运行结果:
李逍遥
赵灵儿
林月如
阿奴
王小虎
沈欺霜
苏媚
查询性别为女的学生名称:
# 查询性别为女的学生
students = Student.query.filter(Student.gender == "女")
for student in students:
print(student.name)
运行结果:
赵灵儿
林月如
阿奴
沈欺霜
苏媚
新增姓名为唐雪见的女性学生:
# 新增唐雪见
student = Student(name="唐雪见",gender="女")
db.session.add(student)
db.session.commit()
结果:
把唐雪见的性别修改为男:
student = Student.query.filter(Student.name == "唐雪见").first()
student.gender = "男"
db.session.commit()
结果:
删除唐雪见:
student = Student.query.filter(Student.name == "唐雪见").first()
db.session.delete(student)
db.session.commit()
完整代码:
from flask import Flask, request
from flask_restful import Resource, Api
from flask_sqlalchemy import SQLAlchemy
# 创建Flask应用
app = Flask(__name__)
# 加载配置文件
app.config.from_object("configs")
# 创建sqlalchemy对象
db = SQLAlchemy(app)
# 使用flask_restful创建api对象,用于注册路由
api = Api(app)
# 编写类视图
class HelloWorldView(Resource):
def get(self):
name = request.args.get("name")
age = request.args.get("age")
gender = request.args.get("gender", default="默认值")
print(name, age, gender)
return "HelloWorld"
def post(self):
name = request.json.get("name")
age = request.json.get("age")
gender = request.json.get("gender")
return {
"code": 200,
"msg": "请求成功",
"data": {
"name": name,
"age": age,
"gender": gender
}
}
# 编写model
class Student(db.Model):
"""
学生表
"""
__tablename__ = 'student'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text) # 姓名
gender = db.Column(db.Integer) # 性别
# 注册路由
api.add_resource(HelloWorldView, r"/hello")
if __name__ == '__main__':
app.run(port=8716, host='0.0.0.0')
# 查询所有学生
# students = Student.query.all()
# for student in students:
# print(student.name)
# 查询性别为女的学生
# students = Student.query.filter(Student.gender == "女")
# for student in students:
# print(student.name)
# 新增唐雪见
# student = Student(name="唐雪见",gender="女")
# db.session.add(student)
# db.session.commit()
# 删除唐雪见
# student = Student.query.filter(Student.name == "唐雪见").first()
# db.session.delete(student)
# db.session.commit()