zvvq技术分享网

如何使用Flask Blueprint和SQLAlchemy编写Python应用程序

作者:zvvq博客网
导读安装准备 1 2 a style=color:#f60; text-decoration:underline; href="https://www.php.cn/zt/15730.html" target="_blank"python/a3 -V pip3 -V pip3 install pipenv 登录后复制 pipenv 1 pipenv shell 登录后复制 pycharm的环境配置在这

安装准备

1

内容来自samhan666

2

zvvq好,好zvvq

<a style=color:f60; text-decoration:underline; href="https://www.php.cn/zt/15730.html" target="_blank">python</a>3 -V && pip3 -V

内容来自zvvq,别采集哟

pip3 install pipenv 本文来自zvvq

pipenv

1 内容来自samhan666

pipenv shell zvvq

pycharm的环境配置在这里就不做过多解释了,这里针对后续的代码进行讲解。

内容来自samhan

开始实践

Flask 原理是在App初始化时,将蓝图和App进行绑定来实现Web路由功能,路由的实现是所有项目中的第一步。 内容来自samhan666

入口文件

在项目开始之前,定义一个入口文件,让请求实例化App,入口文件需要做的是初始化配置文件、引入控制器、初始化数据库等操作。 内容来自samhan666

1 zvvq

2 内容来自samhan

3

zvvq.cn

4

内容来自samhan

5

内容来自samhan

6 本文来自zvvq

def create_app(): 内容来自samhan

app = Flask(__name__) copyright zvvq

导入config中的配置文件 copyright zvvq

app.config.from_object(&39;app.config.setting&39;)

内容来自zvvq,别采集哟

app.config.from_object(&39;app.config.secure&39;)

zvvq

return app 本文来自zvvq

在启动文件中进行调用,启动文件中需要加入判断,原因后续再做解释。

内容来自zvvq,别采集哟

1 内容来自zvvq

2

内容来自samhan

3 内容来自samhan

4

内容来自samhan

from app.app import create_app zvvq好,好zvvq

app = create_app()

本文来自zvvq

if __name__ == &39;__main__&39;:

内容来自samhan

app.run(debug =True,port=81,host= &39;0.0.0.0&39;) zvvq.cn

路由

Flask是用蓝图实现的路由功能,在入口文件中添加注册蓝图的方法,实现引入和注册。

内容来自zvvq

Python免费”; 本文来自zvvq

1

copyright zvvq

2

内容来自samhan666

3

copyright zvvq

4 copyright zvvq

5

内容来自samhan

from flask import Blueprint

本文来自zvvq

login = Blueprint(&39;login&39;, __name__)

内容来自zvvq

@login.route(&39;/login&39;) zvvq

def loginIndex():

内容来自zvvq,别采集哟

return "login Hello" 内容来自zvvq

在app实例初始化时,引入蓝图模块 zvvq

1

内容来自samhan

2 zvvq好,好zvvq

3 zvvq

4 zvvq好,好zvvq

5

内容来自zvvq

6

本文来自zvvq

7 zvvq.cn

8 zvvq

9

本文来自zvvq

10

内容来自samhan

11 内容来自zvvq,别采集哟

12

zvvq

from flask import Flask zvvq好,好zvvq

def create_app():

内容来自zvvq

app = Flask(__name__)

内容来自samhan666

导入config中的配置文件 copyright zvvq

app.config.from_object(&39;app.config.setting&39;) 内容来自zvvq

app.config.from_object(&39;app.config.secure&39;) 内容来自samhan

注册并导入蓝图

内容来自zvvq,别采集哟

register_blue(app) zvvq.cn

return app zvvq好,好zvvq

def register_blue(app): 本文来自zvvq

from app.api.login import login

内容来自samhan666

app.register_blueprint(login) 内容来自samhan

优化路由器

在每一个路由器中可以添加一个装载器,在初始化来依次加载Flask中的蓝图,已到达优化路由器的目的。 zvvq.cn

1

zvvq

2 内容来自samhan

3 zvvq好,好zvvq

4 内容来自zvvq

5 内容来自zvvq

6 内容来自samhan

7

内容来自zvvq,别采集哟

8

内容来自zvvq,别采集哟

9

内容来自zvvq,别采集哟

10

zvvq.cn

11

内容来自zvvq,别采集哟

12 本文来自zvvq

13 本文来自zvvq

14 内容来自zvvq,别采集哟

class BaseRoutes: zvvq好,好zvvq

def __init__(self, name):

内容来自zvvq

self.name = name 内容来自zvvq

self.loader = [] zvvq好,好zvvq

def route(self, rule, options):

zvvq好,好zvvq

def decorator(f):

内容来自zvvq,别采集哟

self.loader.append((f, rule, options))

zvvq.cn

return f

内容来自samhan

return decorator 内容来自samhan

def register(self, bp, url_prefix=&39;&39;):

zvvq.cn

依次注册蓝图

copyright zvvq

for f, rule, options in self.loader:

zvvq

endpoint = options.pop("endpoint", f.__name__)

内容来自zvvq,别采集哟

bp.add_url_rule(url_prefix + rule, endpoint, f, options) 本文来自zvvq

api文件中使用优化后的装载器代码如下: 内容来自zvvq,别采集哟

1 zvvq

2

zvvq.cn

3 内容来自samhan

4 内容来自samhan

5

zvvq.cn

from app.libs.BaseRoutes import BaseRoutes

zvvq好,好zvvq

api = BaseRoutes(&39;login&39;)

copyright zvvq

@api.route(&39;/login/loginHandle&39;, methods=[&39;GET&39;, &39;POST&39;]) zvvq.cn

def loginHandle():

内容来自zvvq

return "login Hello" zvvq.cn

SQLAlchemy

对web的路由完成后,我们开始对数据库的增删改查进行进一步的实践和探索,flask使用SQLAlchemy进行对数据库的操作,这里我们以Mysql数据库为例。 内容来自samhan

使用SQLAlchemy需要安装数据库+驱动包两个组件,安装 Flask-SQLAlchemy + PyMySQL 两个组件,会使我们的开发变的更加简洁和方便。 内容来自zvvq,别采集哟

database类的定义

对于Flask的所有应用和插件而言,都需要注册在App实力中,使用对象进行操作,先定义数据库操作的基类,让其他的模块注册在Base中。

内容来自zvvq,别采集哟

Base中写入所有DB中的公共方法,以减少重复造轮子的过程。 内容来自zvvq,别采集哟

Base 中实例化SQLAlchemy

本文来自zvvq

1

zvvq好,好zvvq

2 zvvq好,好zvvq

3 zvvq

4 本文来自zvvq

5 zvvq.cn

from flask_sqlalchemy import SQLAlchemy 内容来自samhan

db = SQLAlchemy() zvvq

class Base(db.Model): 本文来自zvvq

忽略基类的主键

copyright zvvq

__abstract__ = True

本文来自zvvq

普通数据类继承Base类,以User类为例,使用之前引入db包

zvvq好,好zvvq

1 内容来自zvvq,别采集哟

2 本文来自zvvq

3

内容来自samhan

4 copyright zvvq

5 本文来自zvvq

6 copyright zvvq

7 zvvq.cn

8 zvvq.cn

9 zvvq.cn

10

内容来自samhan666

11

zvvq.cn

12

本文来自zvvq

13

内容来自samhan

from app.models.base import Base

zvvq.cn

class User(Base): 内容来自samhan666

__tablename__ = &39;user&39; zvvq

id = Column(Integer, primary_key=True, autoincrement=True)

copyright zvvq

name = Column(String(50), nullable=False, default="")

内容来自zvvq

email = Column(String(120), nullable=False, default="")

copyright zvvq

_password = Column(&39;password&39;,String(64))

zvvq好,好zvvq

@property

zvvq.cn

def password(self): 内容来自zvvq

return self._password

copyright zvvq

@password.setter 内容来自zvvq,别采集哟

def password(self, raw):

zvvq

self._password = generate_password_hash(raw) copyright zvvq

入口文件加载DB

在加载数据时需要加载数据库初始化的配置,使用SQLALCHEMY_DATABASE_URI指定,有指定的格式。

zvvq

1 zvvq好,好zvvq

SQLALCHEMY_DATABASE_URI = &39;mysql+pymysql://root:123456@127.0.0.1:3306/admin?charset=utf8&39;

内容来自zvvq

SQLALCHEMY_DATABASE_URI =数据库+驱动名称://用户名:密码@ip地址:端口号/数据库名称

copyright zvvq

1

内容来自zvvq

2 内容来自zvvq,别采集哟

3

内容来自zvvq

4 zvvq好,好zvvq

5

内容来自samhan

6 zvvq好,好zvvq

7 zvvq

8 内容来自samhan

def create_app():

zvvq好,好zvvq

app = Flask(__name__) 内容来自zvvq,别采集哟

app.config.from_object(&39;app.config.secure&39;)

zvvq

初始化数据库 内容来自zvvq,别采集哟

db.init_app(app) 内容来自zvvq

with app.app_context(): 本文来自zvvq

db.create_all() 内容来自zvvq

return app 内容来自zvvq,别采集哟

说明和解释一下with关键字的作用,在python中主要使用的是栈数据结构来运行App实例,with关键字能很好的区分上下文,当资源断开时会自动释放和回收,对程序能启到优化的作用。

内容来自samhan666

mysql的驱动可以使用cymysql,也可以使用pymysql,网上使用pymysql的教程会偏多一点,使用驱动时,如果拿不定主意去github上使用stat数多的插件,选大众型的,这样解决方案也会多一点。 copyright zvvq

模块中定义方法

model中可以定义模型,常量,直接操作数据库的原子方法,也可以使用db.session的形式来读取数据。 内容来自zvvq

1

内容来自samhan666

2 内容来自samhan666

3 内容来自zvvq

4 本文来自zvvq

5

zvvq.cn

6 zvvq.cn

7

内容来自samhan666

8 内容来自samhan

9 内容来自samhan666

10 zvvq.cn

11

内容来自zvvq

12

内容来自samhan

13 zvvq.cn

14 zvvq

from sqlalchemy import Column, Integer, String, SmallInteger

copyright zvvq

from app.models.base import Base, db zvvq.cn

class tp_manager(Base):

内容来自zvvq,别采集哟

STATUS_NORMAL = 1 本文来自zvvq

STATUS_STOP = 0 内容来自samhan666

... 内容来自zvvq

@classmethod 内容来自zvvq,别采集哟

def get_manager_by_name(cls, username):

copyright zvvq

r = cls.query.filter(cls.username == username, cls.status == cls.STATUS_NORMAL).one() zvvq.cn

return r

内容来自samhan

@classmethod 本文来自zvvq

def get_db(cls): 本文来自zvvq

r = db.session.query(cls).filter(cls.status == cls.STATUS_NORMAL).all()

zvvq

return r 内容来自zvvq,别采集哟

在路由中的使用

在路由中使用时,需要引入models中对应的model包,下面是一个简单使用的Demo,用户的权限可以使用falsk-login组件来存储用户信息。

zvvq好,好zvvq

1 内容来自samhan

2 copyright zvvq

3 内容来自zvvq,别采集哟

4 zvvq好,好zvvq

5

内容来自zvvq,别采集哟

6 内容来自zvvq

7 copyright zvvq

8 本文来自zvvq

9 zvvq好,好zvvq

10 内容来自samhan666

11 zvvq.cn

12 zvvq.cn

13

zvvq

14 内容来自samhan

15 zvvq

16

内容来自samhan

17

内容来自samhan

18 zvvq好,好zvvq

19 本文来自zvvq

20 copyright zvvq

from flask import request, session, jsonify 内容来自samhan666

from app.libs.BaseRoutes import BaseRoutes zvvq好,好zvvq

from app.validators.form.login import LoginForm 内容来自samhan

from app.models.admin.tp_manager import tp_manager 内容来自samhan

api = BaseRoutes(&39;login&39;) 内容来自zvvq,别采集哟

@api.route(&39;/login/loginHandle&39;, methods=[&39;POST&39;])

内容来自samhan

def loginHandle(): zvvq

form = LoginForm(request.form)

copyright zvvq

if form.validate():

内容来自zvvq,别采集哟

验证通过的逻辑

本文来自zvvq

r = tp_manager.get_manager_by_name(form.username.data)

zvvq.cn

if r: zvvq好,好zvvq

msg = &39;操作成功&39;

内容来自zvvq,别采集哟

session[&39;manager_id&39;] = r.id 本文来自zvvq

else:

内容来自samhan

msg = &39;账号和密码错误&39; 内容来自zvvq,别采集哟

return jsonify({"code": 200, "data": [], "msg": msg}) 本文来自zvvq

else:

内容来自samhan

错误暂时忽略...

zvvq.cn

return form.errors 内容来自samhan

顺便写一句,flask在使用session前,在配置文件中需要配置SECRET_KEY,不然会报错,key值自定义即可。 内容来自samhan666

1 本文来自zvvq

SECRET_KEY = &39;需要加密的key值&39; zvvq

SQLAlchemy实现mysql编码、列类型

在SQLAlchemy 对Mysql实现了基本操作以后,我发现设置出来的默认值没有生效,字符集编码也被设置成了默认的latin1,优化Mysql的列类型,实现Mysql连接池、接入mongo、redis等NoSql数据库成了下一步要研究的问题。

copyright zvvq

默认值和索引设置

python源码包里的解释很清晰 还附带了例子 ,在Column中是这样设置的: zvvq

1

内容来自samhan666

Column(Integer, index=True, nullable=False,  server_default="0",comment="昵称") 本文来自zvvq

server_default Orm设置初始化Mysql的值,unique指定的是否为唯一索引,default是在SQLAlchemy进行CURD操作时进行的默认值,server_defaul和default的值必须是字符串类型的。 内容来自zvvq

index是设置索引,nullable设置是否为空,comment设置的是备注信息。

zvvq好,好zvvq

兼容Mysql列类型

但是摆在眼前一个问题,你想使用tinyint类型,字符集怎么设置? zvvq好,好zvvq

1 本文来自zvvq

2 zvvq.cn

from sqlalchemy.dialects.mysql import VARCHAR, TEXT, BIGINT, INTEGER, SMALLINT, TINYINT, DECIMAL, FLOAT, \

zvvq.cn

DOUBLE, DATETIME, TIMESTAMP, DECIMAL

zvvq好,好zvvq

以使用最多的int和varchar为例,使用之前要导入对应的包:

zvvq

1

copyright zvvq

2 内容来自samhan666

3 本文来自zvvq

4

内容来自samhan

5 zvvq

6 内容来自zvvq,别采集哟

7

zvvq

8 zvvq.cn

9 zvvq好,好zvvq

10 zvvq

11 内容来自samhan666

12

zvvq好,好zvvq

13 内容来自zvvq

14 本文来自zvvq

15

zvvq.cn

from sqlalchemy import Column, Index, Integer copyright zvvq

from sqlalchemy.dialects.mysql import VARCHAR, TEXT, BIGINT, INTEGER, SMALLINT, TINYINT, DECIMAL, FLOAT, \ 内容来自samhan

DOUBLE, DATETIME, TIMESTAMP, DECIMAL

copyright zvvq

from app.models.base import Base, db

本文来自zvvq

class wm_user_user(Base):

copyright zvvq

STATUS_NORMAL = 1 zvvq.cn

__tablename__ = &39;wm_user_user&39; 内容来自samhan

user_status = Column(TINYINT(display_width=1,unsigned=True), nullable=False, server_default="1",

zvvq.cn

comment="1为正常,0为审核中") 内容来自samhan666

user_nickname = Column(VARCHAR(length=50), index=True, nullable=False, comment="昵称")

copyright zvvq

添加配置设置编码 内容来自samhan

__table_args__ = {

zvvq.cn

&39;mysql_charset&39;: &39;utf8mb4&39;, 本文来自zvvq

&39;mysql_collate&39;: &39;utf8mb4_general_ci&39; 内容来自zvvq,别采集哟

}

内容来自samhan666

TINYINT类型中有三个参数:

本文来自zvvq

display_width 设置的是列类型宽度,设置完以后会显示tinyint(1),第二个unsigned 是否是取正值的取值范围,第三个zerofill是否填充,值是一个数字类型,下面是TINYINT的源码使用说明。

内容来自zvvq

1 内容来自samhan

2

copyright zvvq

3

copyright zvvq

4

本文来自zvvq

5 zvvq.cn

6 本文来自zvvq

7

zvvq.cn

8

zvvq

"""Construct a TINYINT.

内容来自samhan

:param display_width: Optional, maximum display width for this number.

zvvq

:param unsigned: a boolean, optional.

内容来自samhan666

:param zerofill: Optional. If true, values will be stored as strings 内容来自samhan666

left-padded with zeros. Note that this does not effect the values 本文来自zvvq

returned by the underlying database API, which continue to be 内容来自zvvq,别采集哟

numeric.

本文来自zvvq

""" 内容来自samhan666

简单在介绍一下,以varchar为代码的字符串类型,字符串类型是必须显示声明字符串长度,用length实现,不加入length的值在初始化会发生错误。 内容来自samhan

自定义数据库名和字符集编码

__tablename__设置的是自定义数据表名,底下的设置的是数据表字符集编码,要使用utf8mb4编码和utf8mb4_general_ci编码,这里就不做过多的解释了。 内容来自zvvq

1

zvvq

2 内容来自zvvq,别采集哟

3 zvvq好,好zvvq

4

内容来自zvvq,别采集哟

5 内容来自samhan

6

zvvq好,好zvvq

__tablename__ = &39;wm_user_user&39;

zvvq好,好zvvq

...

zvvq.cn

__table_args__ = { copyright zvvq

&39;mysql_charset&39;: &39;utf8mb4&39;,

内容来自zvvq

&39;mysql_collate&39;: &39;utf8mb4_general_ci&39; 本文来自zvvq

} zvvq.cn

以上就是如何使用Flask Blueprint和SQLAlchemy编写Python应用程序的详细内容,更多请关注其它相关文章! zvvq