Flask
源码地址是:https://github.com/pallets/flask
Flask是一个使用 Python 编写的轻量级 Web 应用框架,较其他同类型框架更为灵活、轻便、安全且容易上手,有很强的定制性,用户可以根据自己的需求来添加相应的功能,其强大的插件库可以让用户实现个性化的网站定制。
使用Flask开发REST服务可以使用flask的路由来实现,也可以使用扩展插件。
本文使用扩展插件flask-restful实现。
Flask-restful
源码地址是:https://github.com/flask-restful/flask-restful
安装:
pip install flask-restful
新建HelloWorld.py,实现最简单的Hello World代码
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
运行:
python HelloWorld.py
可以看到服务在缺省的5000端口运行
* Running on http://127.0.0.1:5000/
测试
curl http://127.0.0.1:5000/
{"hello": "world"}
菜谱查询REST服务
新建recipeRestService.py,定义recipes类的get方法,根据输入的name、page参数查询菜谱数据并返回json,代码如下:
from flask import Flask
from flask_restful import Api, Resource,reqparse
import pymysql
import json
app = Flask(__name__)
#防止汉字乱码
app.config.update(RESTFUL_JSON=dict(ensure_ascii=False))
api = Api(app)
#输入参数
parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True, help='名称不能为空。')
parser.add_argument('page', type=int, required=False, help='')
#数据库连接
conn=pymysql.connect(host = '127.0.0.1' ,user = '',passwd='',port= 3306,db='' ,charset='utf8')
class recipes(Resource):
def get(self):
data= parser.parse_args()
name = data.get('name') #名称
page = data.get('page') #页码
if page==None:
page = 1
pagecount = 7 #每页记录数
_cur = conn.cursor()
start = 0 + (page-1)*pagecount
end = pagecount
sql = "select * from recipes where name like '%"+name +"%' limit " + str(start) +"," + str(end)
print(sql)
json_data = []
try:
_cur.execute(sql)
results = _cur.fetchall()
for result in results:
data = {}
data["recipeid"] = result[0]
data["name"] = result[1]
data["coverimage"] = result[2]
data["stars"] = result[3]
data["categories"] = result[4]
data["desc"] = result[5]
data["ingredients"] = result[6]
data["method"] = result[7]
data["images"] = result[8]
data["tips"] = result[9]
data["source"] = result[10]
json_data.append(data)
print(json_data.length)
except:
conn.rollback()
_cur.close()
return json.dumps(json_data, ensure_ascii=False)
api.add_resource(recipes, '/recipes')
if __name__ == "__main__":
app.run(host='0.0.0.0',port=5000,debug=True)
代码里有几个地方要说明一下:
1、汉字乱码的处理
增加设置
app.config.update(RESTFUL_JSON=dict(ensure_ascii=False))
返回json时
return json.dumps(json_data, ensure_ascii=False)
2、用IP地址可以访问
缺省只能用127.0.0.1访问服务,如果要用IP地址可以访问,需要将host设置为0.0.0.0
测试一下
浏览器输入:http://127.0.0.1:5000/recipes?name=鱼
"[{\"recipeid\": 1926472, \"name\": \"剁椒鱼头\", "coverimage\": \"https://st-cn.meishij.net/r/155/126/5469155/s5469155_155581953013661.jpg\", \"stars\": \"471\", \"categories\": \"['剁椒鱼头']\", \"desc\": null, \"ingredients\": \"['一个 鱼头', '100克 剁椒', '适量 生姜', '适量 葱花', '8个 蒜米', '25克 料酒', '20克 油', '2克 盐', '10克 酱油', '10克 蚝油']\", \"method\": \"['生姜洗净去皮,一半切薄片,一半切小块,香葱洗净,葱白部分切小段,叶子部分切成葱花', '找一个有深度的盘子,先放入适量的姜片和葱白,放入对半切开的鱼头,鱼肉上黑色的内膜要撕掉,鱼头往右部分划2刀,抹上2克盐简单入味,淋上料酒去腥,鱼头的2面都要淋料酒,腌制10分钟左右', '蒜米放料理机里剥皮', '姜块和剥皮的蒜米放入切碎机里搅打成细小的颗粒', '剁椒是买的瓶装的', '重点来了,鱼头腌制好别急着加剁椒,先放到烧热水的锅里,大火蒸6分钟,盘子里蒸出来的水是最腥的,一定要倒掉,这样蒸出来的鱼头才没有腥味,也不会影响剁椒酱汁的咸度', '换一个小锅,烧热后放入10克玉米油,先放姜蒜末小火煸出香味,再加入剁椒翻炒均匀', '加入盐、生抽和蚝油调味煮开', '煮好的剁椒酱汁淋到鱼头上', '放入烧开水的锅里大火蒸8分钟,如果鱼头比较大,适当的延长时间', '鱼头蒸熟后取出撒上葱花,小锅里放入10克油烧热,淋到鱼头上']\", \"images\": \"[['https://st-cn.meishij.net/rs/155/126/5469155/n5469155_155581955058468.jpg'], ['https://st-cn.meishij.net/rs/155/126/5469155/n5469155_155581955379549.jpg'], ['https://st-cn.meishij.net/rs/155/126/5469155/n5469155_155581955734604.jpg'], ['https://st-cn.meishij.net/rs/155/126/5469155/n5469155_155581956425296.jpg'], ['https://st-cn.meishij.net/rs/155/126/5469155/n5469155_155581956812598.jpg'], ['https://st-cn.meishij.net/rs/155/126/5469155/n5469155_155581957249566.jpg'], ['https://st-cn.meishij.net/rs/155/126/5469155/n5469155_155581957701998.jpg'], ['https://st-cn.meishij.net/rs/155/126/5469155/n5469155_155581958253729.jpg'], ['https://st-cn.meishij.net/rs/155/126/5469155/n5469155_155581959218606.jpg'], ['https://st-cn.meishij.net/rs/155/126/5469155/n5469155_155581959688559.jpg'], ['https://st-cn.meishij.net/rs/155/126/5469155/n5469155_155581960321363.jpg']]\", \"tips\": \"\", \"source\": null}]"
成功,后端平台都通了,后面开始显示层APP开发。