Python搭建Flask+MySQL+Blueprint项目

转载 coder的自我修养  2019-12-11 13:31:17  阅读 564 次 评论 0 条
Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。
Blueprint 是一个存储操作方法的容器,这些操作在这个Blueprint 被注册到一个应用之后就可以被调用,Flask 可以通过Blueprint来组织URL以及处理请求。
1、新建工程
我们在pycham里新建工程
File --> New Project
这里我们选择Flask工程,选择目录后点击Create

Python搭建Flask+MySQL+Blueprint项目 建站 第1张

这样我们一个简单的flask工程就新建好了
下面我们看一下目录结构

Python搭建Flask+MySQL+Blueprint项目 建站 第2张

可以看到目录下文件很少下面我们来解释一下
  • static:存放静态资源

  • templates:存放页面模板

  • app.py:项目入口


2、设置运行环境
为了避免与其他项目的环境造成冲突,所以这里我们为本项目新建虚拟的python环境
一般会默认新建一个,如果没有则按照以下步骤新建
File --> Settings --> Project:flask-mysql --> Project Interpreter

Python搭建Flask+MySQL+Blueprint项目 建站 第3张


选择好目录后点击 OK,这里我已经新建好了,就不在新建了

Python搭建Flask+MySQL+Blueprint项目 建站 第4张

这样我们就创建了一个简单的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)'运行项目

Python搭建Flask+MySQL+Blueprint项目 建站 第5张

出现如下信息说明启动成功

Python搭建Flask+MySQL+Blueprint项目 建站 第6张

flask的默认端口是5000,我们用Postman来访问一下

Python搭建Flask+MySQL+Blueprint项目 建站 第7张


下面我们来修改一下启动端口及其他参数
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端口

Python搭建Flask+MySQL+Blueprint项目 建站 第8张

4、集成MySQL和Blueprint
我们使用Flask-SQLAlchemy来连接MySQL
安装Flask-SQLAlchemy
pip3 install Flask-SQLAlchemy
这里我们直接在pycharm里安装
File --> Settings --> Project:flask-mysql --> Project Interpreter
点击红框中的 + 号

Python搭建Flask+MySQL+Blueprint项目 建站 第9张


输入  Flask-SQLAlchemy

Python搭建Flask+MySQL+Blueprint项目 建站 第10张


然后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表结构如下

Python搭建Flask+MySQL+Blueprint项目 建站 第11张


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 ""
现在项目最终的目录结构如下

Python搭建Flask+MySQL+Blueprint项目 建站 第12张


修改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/

Python搭建Flask+MySQL+Blueprint项目 建站 第13张


看一下数据库中数据

Python搭建Flask+MySQL+Blueprint项目 建站 第14张

新增成功

再用get方式来访问
http://localhost:8090/user/

Python搭建Flask+MySQL+Blueprint项目 建站 第15张

查询成功
本文只介绍了简单项目搭建以及简单的使用方法如有错误请提出指正。


本文地址:https://www.itcodeit.com/post/8.html
温馨提示:文章内容系作者个人观点,不代表码农出没对观点赞同或支持。
版权声明:本文为转载文章,来源于 coder的自我修养 ,版权归原作者所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?