Flask 蓝图,数据库链接

蓝图

使用场景

如果代码非常多,要进行归类。不同的功能放在不同的文件,把相关的视图函数也放进去。

蓝图也就是对flask的目录结构进行分配(应用于小,中型的程序)

当然对于大型项目也可以通过   url_prefix 加前缀的方式实现

使用方法

# __init__.py
from .views.account import ac
from .views.user import usapp.register_blueprint(ac)
app.register_blueprint(us)# account.py
from flask import Blueprint,render_template
ac = Blueprint("ac" ,__name__,template_folder="xxxx",static_url_path="xxxx")# template_folder 优先在 templates 文件夹找。找不到再去 xxxx 里找
# static_url_path 优先在 static 文件夹找。找不到再去 xxxx 里找
# url_prefix="/xx" 为当前蓝图的url里加前缀 

 

目录结构

crm crmviewaccount.pyuser.pystatictemplateslogin.html__init__.pymanage.py

 __init__.py

只要一导入crm就会执行__init__.py文件

在此文件实现app 对象的生成,以及所有蓝图的注册功能

from flask import Flask
from .views.account import ac
from .views.user import us
def create_app():app = Flack(__name__)@app.before_request   # 对全局的视图有效 def xx():print("app.before_request")app.register_blueprint(ac)app.register_blueprint(us)return app 

account.py

各自的视图文件,创建蓝图对象

自己视图的使用为自己的蓝图对象

注意: 视图函数的名字不能和蓝图对象重名

from flask import Blueprint,render_template
ac = Blueprint("ac" ,__name__,template_folder="xxxx",static_url_path="xxxx")
# template_folder 优先在 templates 文件夹找。找不到再去 xxxx 里找
# static_url_path 优先在 static 文件夹找。找不到再去 xxxx 里找
# url_prefix="/xx" 为当前蓝图的url里加前缀 
@ac.route("/login")
def login():return render_template("login.html")

user.py

from flask import Blueprint    
us = Blueprint("us" ,__name__)@us.before_request   # 仅对当前的视图有效
def xx():print("us.before_request")@us.route("/user")
def user():return "user"

DBUtils 链接数据库

flask中是没有ORM的,如果在flask里面连接数据库有两种方式

pymysql
SQLAlchemy是python 操作数据库的一个库。能够进行 orm 映射官方文档 sqlchemySQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。

 

pymysql 实现数据库操作

方式一  数据库链接放在视图中

  每次视图的执行进行数据库连接查询关闭。

  反复创建数据库链接,多次链接数据库会非常耗时 

解决办法:放在全局,单例模式

#!usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
from  flask import Flaskapp = Flask(__name__)@app.route('/index')
def index():# 链接数据库conn = pymysql.connect(host="127.0.0.1",port=3306,user='root',password='123', database='pooldb',charset='utf8')cursor = conn.cursor()cursor.execute("select * from td where id=%s", [5, ])result = cursor.fetchall()  # 获取数据cursor.close()conn.close()  # 关闭链接print(result)return  "执行成功"if __name__ == '__main__':app.run(debug=True)

方式二  放在全局

  不在频繁链接数据库。

  如果是单线程,这样没什么问题,

  但是如果是多线程,就得加把锁。这样就成串行的了

  为了支持并发,此方法依旧不可取

#!usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
from  flask import Flask
from threading import RLockapp = Flask(__name__)
CONN = pymysql.connect(host="127.0.0.1",port=3306,user='root',password='123', database='pooldb',charset='utf8')@app.route('/index')
def index():with RLock:cursor = CONN.cursor()cursor.execute("select * from td where id=%s", [5, ])result = cursor.fetchall()  # 获取数据cursor.close()print(result)return  "执行成功"
if __name__ == '__main__':app.run(debug=True)

 

为此。为了解决方式一二的问题,实现不频繁操作且可以并行的数据库链接,我们需要用到 DBUtils 

方式三 DBUtils + thread.local

为每一个线程创建一个链接(是基于本地线程来实现的。thread.local),

每个线程独立使用自己的数据库链接,该线程关闭不是真正的关闭,本线程再次调用时,还是使用的最开始创建的链接,直到线程终止,数据库链接才关闭

 

 

#!usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask
app = Flask(__name__)
from DBUtils.PersistentDB import PersistentDB
import pymysql
POOL = PersistentDB(creator=pymysql,  # 使用链接数据库的模块maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]ping=0,# ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = alwayscloseable=False,# 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接)threadlocal=None,  # 本线程独享值得对象,用于保存链接对象,如果链接对象被重置host='127.0.0.1',port=3306,user='root',password='123',database='pooldb',charset='utf8'
)@app.route('/func')
def func():conn = POOL.connection()cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()cursor.close()conn.close() # 不是真的关闭,而是假的关闭。 conn = pymysql.connect()   conn.close()conn = POOL.connection()cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()cursor.close()conn.close()
if __name__ == '__main__': app.run(debug=True)

 

方式四 DBUtils + 链接池

创建一个链接池,为所有线程提供连接,使用时来进行获取,使用完毕后在放回到连接池。

PS:

  假设最大链接数有10个,其实也就是一个列表,当你pop一个,人家会在append一个,链接池的所有的链接都是按照排队的这样的方式来链接的。

  链接池里所有的链接都能重复使用,共享的, 即实现了并发,又防止了链接次数太多

#!usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask
app = Flask(__name__)
from DBUtils.PersistentDB import PersistentDB
import pymysqlPOOL = PooledDB(creator=pymysql,  # 使用链接数据库的模块maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建maxcached=5,  # 链接池中最多闲置的链接,0和None不限制maxshared=3,  # 链接池中最多共享的链接数量,0和None表示全部共享。# PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制setsession=[],  # 开始会话前执行的命令列    AQ 表。如:["set datestyle to ...", "set time zone ..."]threadlocal=None,  # 本线程独享值得对象,用于保存链接对象,如果链接对象被重置ping=0,# ping MySQL服务端,检查是否服务可用。# 取值:# 0 = None = never, # 1 = default = whenever it is requested, # 2 = when a cursor is created, # 4 = when a query is executed, # 7 = alwayshost='127.0.0.1',port=3306,user='root',password='',database='core_master',charset='utf8'
)
@app.route('/func')
def func():conn = POOL.connection()cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()cursor.close()conn.close() # 不是真的关闭,而是假的关闭。 conn = pymysql.connect()   conn.close()conn = POOL.connection()cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()cursor.close()conn.close()
if __name__ == '__main__': app.run(debug=True)

 

转载请标明出处:11.4 Flask 蓝图,数据库链接

文章来源: 11.4 Flask 蓝图,数据库链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基础-02

常见的数据类型 列表 在python中,列表的创建可以是由[]两个方括号组成的。在其他语言中,被称之为数组。 列表里可以存放一组值,并且系统默认的给列表里的每一个元素以索引值,方便查找和使用。 如下: #创建一个列表&…

Flask扩展系列(八)–用户会话管理

安装和启用 遵循标准的Flask扩展安装和启用方式,先通过pip来安装扩展: $ pip install Flask-Login 接下来创建扩展对象实例: 1 2 3 4 5 from flask import Flask from flask.ext.login import LoginManager app Flask(__name__) login…

onmousemove和onmouseout事件的调用,和js使用双引号、单引号的时候应该注意的问题...

使用js的时候&#xff0c;统一使用双引号&#xff0c;然后通过反斜杠进行转义 ①如果同时使用单引号、和双引号的情况下容易出现问题&#xff0c;导致标签中表示的事件不能调用&#xff0c; ②导致由于标签没有封口而出现样式布局错误 1 <!DOCTYPE html>2 <html>3 …

C++ 学习书目

C书单 第一篇 一些同学问我&#xff0c;如何学好C&#xff0c;我没有别的办法给你们&#xff0c;唯一的办法就是读书&#xff0c;读大量的书&#xff0c;就可以解决。要把C作为日常语言&#xff0c;而不是一种程序语言&#xff0c;这样就好办了。 有人又要问我&#xff0c;那么…

CentOS6.5安装配置

一、网络设置&#xff1a; 1、命令&#xff1a;vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICEeth0 HWADDR00:0C:29:34:11:33 TYPEEthernet UUID6a0e083b-7d65-4afe-9d6f-f42f97659c89 ONBOOTyes NM_CONTROLLEDyes …

js踩过的一些坑

参考我的博客&#xff1a;http://www.isedwardtang.com/2017/08/29/js-bug/转载于:https://www.cnblogs.com/EdwardTang/p/7476769.html

开发中的几款小工具

文本编辑器 ckediter,kindediter,uediter比较多。 http://q.sohu.com/asset/group/ueditor/editor_all.js 马克鳗 用于: 截图测量&#xff0c;取颜色 代码比较工具 Beyond Compare sql书写智能提示工具 SQLPrompt sql自动提示,安装SQLPrompt工具options--->qualification---…

使用PDO总结

PHP使用PDO总结1、php.ini中开启PDO扩展&#xff1a; extensionphp_pdo.dll 重启Apache&#xff01; 2、PDO 构造方法 一共需要三个字段,分别为数据库配置信息&#xff0c;用户名&#xff0c;用户密码 其中数据库配置信息写法mysql:host192.16;post3306;charsetutf-8;dbnametes…

自己写的Python数据库连接类和sql语句拼接方法

python # SQL 查询语句sql "SELECT * FROM user where username %s" % username " and password %s" % password "" 参考&#xff1a; https://www.cnblogs.com/Xjng/p/3821827.html

注册表-显示回收站

WinXP系统下恢复不小心删掉的回收站图标&#xff01; 修改注册表法 1.单击“开始”\“运行”&#xff0c;在“打开”中键入“regedit”&#xff0c;运行注册表编辑器&#xff1b; 2.依次展开注册表至&#xff1a;HKEY&#xff3f;CURRENT&#xff3f;USER\Software\Microsoft\W…

自己如何获取ADO连接字符串

自己如何获取ADO连接字符串 摘自&#xff1a;http://blog.csdn.net/zyq5945/article/details/5586423 有时候我们参考网上的ADO连接字符串写未必就能连接上数据库。今天详细介绍下这个很流行的如何获取ADO字符串的方法&#xff0c;就能很容易直观看到这个连接字符串是否真能连接…

phpstorm+xdebug配置分享

一、选择XDEBUG扩展 xdebug下载地址&#xff1a;https://xdebug.org/download.php 注意&#xff1a;带"ts"是线程安全的意思&#xff0c;"nts"的他没有标示&#xff0c;也就是说&#xff0c;如果是nts的要下载没标示的&#xff0c;下载下来的文件名其实是有…

Flask框架Flask-Login用法分析

参考&#xff1a; https://www.cnblogs.com/cjnmy36723/p/5212047.html https://www.jianshu.com/p/06bd93e21945 Flask-Login插件中带了6种信号&#xff0c;可以基于其中的信号做一些额外工作&#xff0c;比如user_logged_in来记录用户的登录次数和登录IP等。 安装 ? 1 p…

spi驱动 (2):应用与测试

大幅度转载于:https://www.cnblogs.com/zhangyin-ethan/p/7481725.html

Mac安装PostgreSQL和测试安装结果

为什么80%的码农都做不了架构师&#xff1f;>>> 安装&#xff1a;brew install postgresql -v 这一步会安装它和它的各种依赖包&#xff0c;并且初始化元数据库内容添加到开机启动&#xff1a;ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents/ …

不可深交者

1&#xff1a;太过自私&#xff0c;不为他人考虑者&#xff0c;不可深交2&#xff1a;不讲诚信&#xff0c;多次爽约者&#xff0c;不可深交3&#xff1a;己过不该&#xff0c;屡劝屡犯者&#xff0c;不可深交4&#xff1a;不知感恩&#xff0c;过河拆桥者&#xff0c;不可深交…

MySQL--安装linux(5.6版本)

1 版本 目前MySQL数据库按用户群分为社区版(Community Server)和企业版(Enterprise/commercial)。--commercial授权版本 社区版是免费下载的&#xff0c;企业版需要付费且不能在线下载。 社区版分为3种&#xff1a; GA(General Availability)&#xff1a;官方推荐使用的版本&am…

linux命令行总结

简单命令 语法&#xff1a;#ls [路径] 表示列出指定路径下的文件夹和文件的名字&#xff0c;如果路径没有指定则列出当前路径下的语法&#xff1a;#ls -l [路径] 表示以列表的形式列出指定路径下的文件夹和文件的名字语法&#xff1a;#ls -la [路径] …

Flask-Session

https://pythonhosted.org/Flask-Session/

Andoid开发中生成二维码

2019独角兽企业重金招聘Python工程师标准>>> 第一步&#xff1a; 确定我们二维码的位置&#xff0c;即是在我们应用的哪个页面的哪个位置&#xff0c;简单讲就是用一个ImageView把二维码展示出来&#xff0c;我们就把二维码展示在下面布局activity_main.xml中的Imag…