美食地图项目(Flask后台)

一、功能API目录

  1. 用户注册
  2. 邮箱验证码
  3. 用户登录
  4. 获取用户信息
  5. 获取店铺列表
  6. 获取店铺详情
  7. 获取店铺菜单
  8. 获取评论列表
  9. 新增评论
  10. 上传图片

二、项目详解(举例说明,因为流程都一样,就是具体的细节区别而已)

app.py ---->jox_restful/xxx.py ----> jox_api/xxx.py ----> jox_api/Mysql.py or jox_api/Redis.py

1.app.py:项目入口文件,该项目使用flask-restful扩展插件

app = Flask(__name__)
CORS(app, supports_credentials=True)
api = Api(app)# 设置路由api.add_resource(Upload.UploadRoute, '/api/upload')
api.add_resource(Shop.GetShopRoute, '/api/shop_list')
api.add_resource(Shop.GetShopInfoRoute, '/api/shop_inf')
api.add_resource(Shop.GetCommentRoute, '/api/comment_list')
api.add_resource(Shop.AddCommentRoute, '/api/add_comment')
api.add_resource(Shop.GetFoodRoute, '/api/food_list')
api.add_resource(User.LoginRoute, '/api/login')
api.add_resource(User.AddUserRoute, '/api/add_user')
api.add_resource(User.GetCodeRoute, '/api/code')
api.add_resource(User.GetUserRoute, '/api/user_inf')if __name__ == '__main__':app.run(host='127.0.0.1',port=8081)

2.jox_restful: 接收路由请求(下方展示一个示例)

Shop.py:店铺相关

//获取店铺,根据keyword搜索
class GetShopRoute(Resource):@Auth.permission(identifier="any")def post(self):try:self.parser = reqparse.RequestParser()self.shopClass = Shop.Shop()self.parser.add_argument('keyword', type=str, help='keyword: type is str')self.args = self.parser.parse_args()self.keyword = self.args['keyword']self.restatus = self.shopClass.get_shop(self.keyword)return self.restatus, 200except Exception as e:print(e)return {"code":-1,"msg":str(e)},200

3.jox_api: 处理将与数据库交互的数据及拼装返回前端的数据(下方展示一个示例)

Shop.py:店铺相关

//获取店铺,根据keyword搜索
class Shop():def __init__(self):self.mysqlClass = Mysql.MySQL()def get_shop(self,keyword):try:self.sql = "select * from shop where CONCAT(name,module,scene,type,address) like \'%%%s%%\' " %(keyword)self.resql =  self.mysqlClass.select_data(self.sql)if self.resql['state'] != 'E':for shop in self.resql['alldata']:if shop['status']==1:shop['status']="营业中"else:shop['status'] = '停止营业'return {'code':0,'shop_list':self.resql['alldata'],'msg': '获取商铺列表成功'}else:return {'code': -1, 'msg': '获取商铺列表失败'}except Exception as e:print(e)return {"code": -1, "data": {"msg": str(e)}}, 500

三、封装的方法类

1.Auth

使用装饰器对需要验证的请求都做了拦截操作

def permission(identifier="any"):def wrapper(func):def decorated_view(*args, **kwargs):if identifier == "any":return func(*args, **kwargs)elif identifier == "token":tokenClass = Token.Token()token = request.headers['token']validate_token = tokenClass.validate(token)validate_code = validate_token["code"]if validate_code != 1005:return validate_tokenelse:return func(*args, **kwargs)elif identifier == 'add':redisClass = Redis.Redis()parser = reqparse.RequestParser()parser.add_argument('code', type=str, help='code: type is str')parser.add_argument('email', type=str, help='email: type is str')argsd = parser.parse_args()code = argsd['code']email = argsd['email']mailcode = redisClass.get_data('code-'+str(email))if mailcode == None:return {'code': -1, 'msg': '验证码失效'}, 200if mailcode == code:redisClass.delete('code-'+str(email))return func(*args, **kwargs)else:return {'code':-1,'msg':'验证码错误'},200else:return {"code": -1, "msg": "未知错误"}, 200return decorated_viewreturn wrapper

2.Mysql

因为项目中多处需要使用到mysql,所以就按照自己的习惯封装了一下pymysql。

class MySQL(object):def __init__(self):self.jox_dict = Utils.Dict()self.conn = pymysql.connect(host=mysqlConf['ip'], port=mysqlConf['port'], user=mysqlConf['username'],password=mysqlConf['passwd'], database=mysqlConf['DB'],cursorclass=pymysql.cursors.DictCursor )//执行查询sql时调用def select_data(self, sql):try:self.cur = self.conn.cursor()self.cur.execute(sql)self.cur.close()self.alldata = self.cur.fetchall()except Exception as e:# 发生错误时回滚,并返回erroself.conn.rollback()return {"state":"E","msg":str(e)}if len(self.alldata) > 0:self.alldata = self.jox_dict.data_format(self.alldata)return {"state": "T", "msg": "返回"+str(len(self.alldata))+"条数据" ,"alldata":self.alldata}else:return {"state": "F", "msg": "返回"+str(len(self.alldata))+"条数据",'alldata':[]}//执行插入单条数据或者更新单条数据时调用def insert_data(self,sql):try:self.cur = self.conn.cursor()# 执行SQL语句self.cur.execute(sql)# 提交到数据库执行self.conn.commit()return {"state": "T", "msg": str(self.cur)}except Exception as e:# 发生错误时回滚,并返回erroself.conn.rollback()return {"state": "E", "msg": str(e)}//执行插入/更新多条数据时调用,第一次调用时conn参数传None即可def add_insert(self,sql,conn):try:if conn =="":conn = self.connself.cur = conn.cursor()# 执行SQL语句self.cur.execute(sql)return {"state": "T", "conn":conn,"cur":self.cur}except Exception as e:return {"state": "E", "msg": str(e)}//调用add_insert后,需要在最后的时候调用commit_inserst,将任务提交到数据库执行def commit_inserst(self,conn):try:# 提交到数据库执行conn.commit()return {"state": "T"}except Exception as e:# 发生错误时回滚,并返回erroconn.rollback()return {"state": "E", "msg": str(e)}

3.Redis

项目中的token、code等缓存数据都存入Redis中,小小的封装了下

class Redis:def __init__(self):self.r = redis.StrictRedis(host=redisConf['ip'],password=redisConf['passwd'], port=redisConf['port'] ,db=0)def set_data(self, key, data, ex=None):self.r.set(pickle.dumps(key), pickle.dumps(data), ex)def delete(self,key):self.r.delete(pickle.dumps(key))# 将文本流从redis中读取并反序列化,返回def get_data(self, key):self.data = self.r.get(pickle.dumps(key))if self.data is None:return Nonereturn pickle.loads(self.data)

4.Utils

项目中用到的一些简单的处理方法

//对时间的操作
class Time():def get_time(self):st = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())sttotime = datetime.datetime.strptime(st, "%Y-%m-%d %H:%M:%S")return sttotimedef more_day(self,datetimes):return datetimes + datetime.timedelta(days=1)
//因为从mysql数据库取出的数据中有可能存在datetime、decimal格式的数据,所以在封装mysql方法的时候直接将数据格式化了
class Dict():def data_format(self,list):for data in list:for key, value in data.items():if isinstance(value,datetime.datetime):data[key] = value.strftime("%Y-%m-%d %H:%M:%S")if isinstance(value,decimal.Decimal):data[key] = float(value)return list

结尾

自我感觉这个flask的项目还有很多的缺点,欢迎各位dalao指正,github链接:https://github.com/jon-son/msdt 。github中会放vue框架写的前端(前端朋友写的)

Flask项目1(美食地图)相关推荐

  1. flask项目中无法更改端口号

    flask项目中无法更改端口号 app.run(port=8000) 问题 启动后是 127.0.0.1:5000 解决方法

  2. 【Flask项目2】模型类的映射方式新版本和旧版本(4)

    方式一:模型类的映射方式旧版本 1.Flask-Migrate介绍 k-migrate可以十分方便的进行数据库的迁移与映射,将我们修改过的ORM模型映射到数据库中.flask_migrate是基于Al ...

  3. centos7 ifconfig命令找不到_centos7+mysql+gunicorn+flask项目部署

    前言 出于学习和实践的目的,近期自己写了一个小项目关于flask的API项目,涉及到服务器的上线部署问题,这里就做一个详细的记录和分享吧~欢迎一起交流学习指正~ 正文 一.centos7安装pytho ...

  4. flask python web开发 可视化开发_Python + Flask 项目开发实践系列六

    今天开始我们讲讲Flask Web实践项目开发中的查看详情功能是如何实现的. Step1:html 部分 lists +="<tr>"+ //拼凑一段html片段 &q ...

  5. flask 项目基本框架的搭建

    综合案例:学生成绩管理项目搭建 一 新建项目目录students,并创建虚拟环境 mkvirtualenv students 二 安装开发中使用的依赖模块 pip install flask==0.1 ...

  6. 【Flask】Nginx+Gunicorn+Supervisor部署一个Flask项目:步骤总结

    为什么要使用gunicorn? Flask 作为一个 Web 框架,内置了一个 webserver, 但这自带的 Server 到底能不能用? 官网的介绍: While lightweight and ...

  7. 【Flask】Nginx / Gunicorn入门:部署你的Flask项目

    什么是Nginx? 参考:Nginx入门 什么是反向代理呢? 我们很多人应该都用过淘宝,要知道每天同时连接到淘宝网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个 ...

  8. Flask部署| gunicorn、nginx部署flask项目,并用supervisor来管理进程

    本科的时候做公众号,开始提供学生教务查询服务,后端从PHP转到Python,无论是使用django还是flask,部署都没PHP那么方便,每次修改程序完,都是ps ax,然后再kill,再run.em ...

  9. Vue项目使用百度地图——经纬度地图组件的封装及使用

    1 前言 要在vue项目使用百度地图api,首先应做以下配置 (1)index.html index.html添加script <script src="http://api.map. ...

最新文章

  1. swift笔记三 使用xcode
  2. 性能优化指南(5000 字小结)
  3. docker registry私有仓库搭建(为k3s准备)
  4. 字符串大小写字母转换c 语言,towlower()
  5. 性能测试的重要意义(一)
  6. ubuntu虚拟机进程被杀死_vmware虚拟机奔溃,如何抢救文件
  7. jQuery对象与dom对象相互转换
  8. 谈谈在深圳挤公交那些事
  9. Onvif协议及协议测试工具使用详解
  10. oracle12c cdb修改,Oracle 12c 配置和修改 CDB 和 PDB 参数
  11. GPRS-PDP上下文激活过程
  12. 物联网数据多又杂?好用的数据可视化服务来了
  13. wps怎么把xlsx转成html,怎样把wps转换成excel
  14. ppm调制matlab程序,求助:谁能帮我编写一个4ppm的解调程序 谢谢了
  15. 做了一个淘宝内部优惠券分享平台支持微信公众号以及网站
  16. 数理统计与数据分析第三版习题 第3章 第5题
  17. 经典4电阻差动放大器
  18. 网络流量监控软件怎样实现
  19. python画图小猪佩奇动画片全集_用Python画小猪佩奇
  20. 黑客是如何攻击目标电脑的

热门文章

  1. Doris入门到精通-阶段一(简介安装使用)
  2. mac电脑最好用的图片浏览器,没有之一
  3. Arduino (一)——面包板与固定导线长度
  4. 求勾股数元祖(java)
  5. 雷诺rarone机械手表日期怎么调?
  6. 我是怎么薅的双十一羊毛
  7. java语言开发的万能简历解析,任何简历都可以 规范格式化数据保存入库! - CSDN博客
  8. Formality总结
  9. 生僻字_tte_linux_ttf_提取字体_打印生僻字_uni
  10. java EE /servlet2/基础