最近在回看之前做的2个flask框架写的项目代码,因为自己主要负责业务逻辑的API那一块,没有整个框架从头到尾实践一遍,借这次回看,写一个很简单的小项目并记录下来,作为自己对flask框架理解思路的梳理和笔记的归纳。
1.前期准备
下载安装python(我个人的习惯是用python3)和mysql数据库。
2.目录结构的制定
首先flask框架是没有固定的项目目录组织结构的,所以我们自己制定出自己风格习惯的目录结构。根据需要存放的文件类型,先简单的定为以下几个目录:
3.代码编写
3.1从apps\__init__.py里入手,创建一个flask实例,并对其进行属性参数的设置:
# -*-coding:utf8-*- from flask import Flask import os from datetime import timedelta from .app_login.views import login_blue from .app_manager.views import manager_blue def create_app(): app = Flask(__name__) # 创建flask实例 app.register_blueprint(login_blue) # 注册蓝图(路由) app.register_blueprint(manager_blue) app.config.update(SECRET_KEY=os.urandom(24)) # 设置密钥 app.permanent_session_lifetime = timedelta(minutes=24*60) return app # 返回设置完参数的flask实例
3.2运行入口:run.py,运行flask实例。
# -*-coding:utf8-*- from apps import create_app from conf import conf app = create_app() # 获取flask实例 if __name__ == '__main__': # 启动服务;是否开启调试模式、监听IP和端口在conf.py里设置 app.run(debug=conf.DEBUG, port=conf.PORT, host=conf.HOST)
3.3配置参数:conf.py。根据生产、测试、开发三种环境设置不同参数,具体的参数值根据自己安装mysql时设定的来填写。
# -*-coding:utf8-*- import os class Config(object): DEBUG = True # flask是否开启debug模式 DB_NAME = 'danni' # 数据库名称 DB_HOST = '127.0.0.1' # 数据库IP DB_PORT = 3306 # 数据库端口(mysql默认为:3306) DB_UN = '' # 数据库账号名 DB_PW = '' # 数据库密码 class ProductionConfig(Config): """ 生产环境 """ DEBUG = False # flask是否开启debug模式 class TestingConfig(Config): """ 测试环境 """ DB_HOST = '127.0.0.1' # 数据库IP地址 R_HOST = '127.0.0.1' # Redis IP地址 class DevelopConfig(Config): """ 开发环境 """ PORT = 8082 # flask端口;flask默认监听本地127.0.0.1:5000 HOST = '0.0.0.0' # flask绑定ip;0.0.0.0表示监听所有地址 # 自动判断环境生产config if os.path.exists('production.conf'): conf = ProductionConfig() conf_ver = 'conf.ProductionConfig' conf_env = u'生产环境' elif os.path.exists('test.conf'): conf = TestingConfig() conf_ver = 'conf.TestingConfig' conf_env = u'测试环境' else: conf = DevelopConfig() conf_ver = 'conf.DevelopConfig' conf_env = u'开发环境'
3.4数据库连接的参数设置:libsdb.py
# -*-coding:utf8-*- import pymysql from conf import conf # 连接数据库 db = pymysql.connect(host=conf.DB_HOST, port=conf.DB_PORT, user=conf.DB_UN, passwd=conf.DB_PW, db=conf.DB_NAME) # 建立游标 cursor = db.cursor(cursor=pymysql.cursors.DictCursor) # 返回{}或[{}, {}, ...] # cursor = db.cursor() # 返回()或((), (), ...)
3.5设置完这些参数后,进入业务逻辑代码:appsapp_manager;分为3部分:__init__.py负责初始化变量等,model.py负责数据库数据处理等,views.py负责不同api接口的逻辑;业务场景:现有一个girls表,控制台端要获取表内所有用户的信息。
danni数据库下girls表的信息(name字段值不能重复):
model.py:数据库的数据操作
# -*-coding:utf8-*- from libs.db import db import datetime import pymysql # 根据用户名user获取对应的用户信息;如果user为空,则获取所有用户信息 def get_users(user): sql = 'select * from girls where status != 1001' if user: sql += ' and name = %a' % user # 数据库的连接参数在libs/db.py设置 cursor = db.cursor(cursor=pymysql.cursors.DictCursor) # 返回{}或[{}, {}, ...] cursor.execute(sql) users = cursor.fetchall() cursor.close() # 记得要关闭 return users
views.py里获取前端传来的数据,根据查询参数和业务逻辑调用model.py里函数
# -*-coding:utf8-*- from flask import Blueprint, render_template, request, jsonify from .model import get_users, insert_user # 声明一个蓝图;设置了蓝图名称、静态文件和模板文件存放的路径及url前缀 manager_blue = Blueprint('manager', __name__, template_folder='../../template', static_folder='../../static', url_prefix='/manager') # 将url和视图函数绑定 # 获取所有会员信息 @manager_blue.route('/getuser', methods=['post']) # 定义url和请求方法:post def get_user(): data = request.form # 获取前端数据 user = data['user'] users = get_users(user) # 调用model.py里get_users() return jsonify({"code": 200, "msg": "success", "data": users})
4.启动服务:即运行run.py:python3 run.py;
根据提示的ip和端口加上自己定义路由访问该地址:http://139.224.10.202:8082/manager/getuser
返回的结果:
5.结尾
到这里就是一个完整的框架流程了,但是还有前端模板渲染、get访问、sql语句遇到的坑等在这里没有提到,可以参考完整的项目代码(也是很简单的,比较好理解)。