原文链接:Python搭建Flask+MySQL+Blueprint项目 - coder的自我修养
Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。
Blueprint 是一个存储操作方法的容器,这些操作在这个Blueprint 被注册到一个应用之后就可以被调用,Flask 可以通过Blueprint来组织URL以及处理请求。
1、新建工程
我们在pycham里新建工程File --> New Project这里我们选择Flask工程,选择目录后点击Create
这样我们一个简单的flask工程就新建好了下面我们看一下目录结构
可以看到目录下文件很少下面我们来解释一下
-
static:存放静态资源
-
templates:存放页面模板
-
app.py:项目入口
2、设置运行环境
为了避免与其他项目的环境造成冲突,所以这里我们为本项目新建虚拟的python环境一般会默认新建一个,如果没有则按照以下步骤新建File --> Settings --> Project:flask-mysql --> Project Interpreter
选择好目录后点击 OK,这里我已经新建好了,就不在新建了
这样我们就创建了一个简单的flask项目,下面让我们来运行它
3、运行Flask项目
打开app.py
from flask import Flask
# Flask初始化参数尽量使用你的包名,这个初始化方式是官方推荐的
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
右键 Run 'Flask(app.py)'运行项目
出现如下信息说明启动成功
flask的默认端口是5000,我们用Postman来访问一下
下面我们来修改一下启动端口及其他参数
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8090, debug=True)
-
host:默认 127.0.0.1,只能本机访问, 如果你需要外网访问,ip需要设置为0.0.0.0
-
port:端口,默认5000
-
debug: 调试模式,开发环境使用,生产不推荐
端口改为之后我们再访问8090端口
4、集成MySQL和Blueprint
我们使用Flask-SQLAlchemy来连接MySQL安装Flask-SQLAlchemy
pip3 install Flask-SQLAlchemy
这里我们直接在pycharm里安装File --> Settings --> Project:flask-mysql --> Project Interpreter点击红框中的 + 号
输入 Flask-SQLAlchemy
然后Install Package就好
按照以上方法来安装PyMySQL、Flask-Restful新建config.py用来配置一些MySQL相关信息写入以下配置
class DevConfig:
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:root@localhost:3306/test?charset=UTF8MB4"
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS = True
新建database.py用来初始化db
写入以下代码
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
flask_sqlalchemy模块并不需要与app一起初始化,可以使用空的代替而应用启动时,可以使用以下方式初始化
db.init_app(app)
新建user包,用来做查询测试在user包下新建如下文件
-
blueprint.py 蓝图restful api配置
-
models.py 用来存放数据库表模型
-
views.py 实体方法
models.py
from database import db
class User(db.Model):
__tablename__ = 'user'
__table_args__ = {"useexisting": True}
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(255))
email = db.Column(db.String(255))
password = db.Column(db.String(255))
def __repr__(self):
return '<User %r>' % self.username
User类与数据库中user表相对应user表结构如下
blueprint.py
# coding: utf8
from flask import Blueprint
from utils.blueprint_util import add_resource
from . import views
user_blueprint = Blueprint('user', __name__, url_prefix='/user')
config = [
(views.UserView, '/')
]
add_resource(user_blueprint, config)
views.py
from flask_restful import Resource
from user.models import User
from database import db
from utils import db_util
from flask import request
import json
class UserView(Resource):
# get方法
def get(self):
users = User.query.filter().all()
return db_util.query_to_dict(users)
# post方法
def post(self):
data = json.loads(request.data)
user = User(username=data.get('username'), password=data.get('password'), email=data.get('email'))
db.session.add(user)
return db_util.query_to_dict(user)
新建utils工具包并在utils包下新建blueprint_util.py和db_util.py
-
blueprint_util.py:蓝图相关
-
db_util.py:models转为dict相关
blueprint_util.py
from flask_restful import Api
def add_resource(blueprint, config):
"""添加restful资源配置
"""
api = Api(blueprint)
for view, url in config:
api.add_resource(view, url)
db_util.py
from datetime import datetime # 有时候会返回datatime类型
from datetime import date, time
from flask_sqlalchemy import Model
from sqlalchemy import DateTime, Numeric, Date, Time # 有时又是DateTime
def query_to_dict(models):
if isinstance(models, list):
if isinstance(models[0], Model):
lst = []
for model in models:
gen = model_to_dict(model)
dit = dict((g[0], g[1]) for g in gen)
lst.append(dit)
return lst
else:
res = result_to_dict(models)
return res
else:
if isinstance(models, Model):
gen = model_to_dict(models)
dit = dict((g[0], g[1]) for g in gen)
return dit
else:
res = dict(zip(models.keys(), models))
find_datetime(res)
return res
# 当结果为result对象列表时,result有key()方法
def result_to_dict(results):
res = [dict(zip(r.keys(), r)) for r in results]
# 这里r为一个字典,对象传递直接改变字典属性
for r in res:
find_datetime(r)
return res
def model_to_dict(model): # 这段来自于参考资源
for col in model.__table__.columns:
if isinstance(col.type, DateTime):
value = convert_datetime(getattr(model, col.name))
elif isinstance(col.type, Numeric):
value = float(getattr(model, col.name))
else:
value = getattr(model, col.name)
yield (col.name, value)
def find_datetime(value):
for v in value:
if isinstance(value[v], datetime):
value[v] = convert_datetime(value[v]) # 这里原理类似,修改的字典对象,不用返回即可修改
def convert_datetime(value):
if value:
if isinstance(value, (datetime, DateTime)):
return value.strftime("%Y-%m-%d %H:%M:%S")
elif isinstance(value, (date, Date)):
return value.strftime("%Y-%m-%d")
elif isinstance(value, (Time, time)):
return value.strftime("%H:%M:%S")
else:
return ""
现在项目最终的目录结构如下
修改app.py代码如下
from flask import Flask
from database import db
from user.blueprint import user_blueprint
from config import DevConfig
app = Flask(__name__)
app.config.from_object(DevConfig)
db.init_app(app)
app.register_blueprint(user_blueprint)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8090, debug=True)
下面我们再来启动app用postman访问post方式 http://localhost:8090/user/
看一下数据库中数据
新增成功再用get方式来访问http://localhost:8090/user/
查询成功本文只介绍了简单项目搭建以及简单的使用方法。详细用法见后续文章。如有错误请提出指正。
博客链接:Python搭建Flask+MySQL+Blueprint项目 - coder的自我修养
欢迎关注公众号: coder 的自我修养