个性化菜谱APP的实现(三) Flask REST服务

本文介绍了如何使用Flask和Flask-RESTful扩展创建菜谱查询REST服务。通过安装Flask-RESTful,编写Python代码实现GET方法,处理汉字乱码,并设置允许IP地址访问,成功构建了一个可以查询菜谱数据的REST服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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开发。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值