一、Flask-Session

  我们使用过flask内置的session,知道它是把session存放在浏览器,即客户端。今天要学习的flask-session是flask的第三方组件,看一下它和flask内置的session有什么不同以及它的使用方法。

  flask-session是flask框架的session组件,flask内置session使用签名cookie保存,而该组件则将支持session保存到多个地方,如:

    - redis

    - memcached

    - filesystem

    - mongodb

    - sqlalchmey

1、安装flask-session

  1. pip3 install flask-session

2、回顾flask自带的session的使用方法

  1.   from flask import Flask, session
  2.  
  3.   app = Flask(__name__)
  4.   app.secret_key = 'afhaslhg' # 一定要有这句
  5.  
  6.   @app.route('/')
  7.   def index():
  8.   session['user'] = 'value'
  9.   return 'hello'
  10.  
  11.   if __name__ == '__main__':
  12.    app.run(debug=True)

  启动程序,使用浏览器访问http://127.0.0.1:5000时,会看到如下session:

3、flask-session的使用(以保存到redis中为例)

  1.   from flask import Flask, session
  2.   from flask_session import Session # 导入flask-session中的Session类
  3.   from redis import Redis
  4.  
  5.   app = Flask(__name__)
  6.   # 对实例进行配置
  7.   app.config["SESSION_TYPE"] = "redis"
  8.   app.config["SESSION_REDIS"] = Redis(host="127.0.0.1",port=6379,db=6)
  9.   
  10.   Session(app) # 把原来app中的 session 进行替换
  11.  
  12.   @app.route('/')
  13.   def index():
  14.    session['user'] = 'value'
  15.    return 'hello'
  16.  
  17.   if __name__ == '__main__':
  18.    app.run(debug=True)

  启动程序(redis服务端要),浏览器访问http://127.0.0.1:5000时,浏览器session如下图:

  打开redis客户端,进行如下操作:

二、WTForms组件

  WTForms是flask的组件,类似于django的modelform组件。

1、安装

  1. pip3 install wtforms

2、使用(以登陆和注册为例)

  wtf.py文件:

  1. from flask import Flask, render_template, request
  2. from wtforms.fields import simple, core
  3. from wtforms import validators
  4. from wtforms import Form
  5.  
  6. app = Flask(__name__)
  7.  
  8. # 定义注册类
  9. class RegForm(Form):
  10. username = simple.StringField(
  11. label="用户名",
  12. validators=[
  13. validators.DataRequired(message='该字段不能为空'),
  14. validators.Length(min=3, max=10, message='用户名必须3-10个字符')
  15. ],
  16. id="user_id",
  17. render_kw={"class": "user_name"}
  18. )
  19. password = simple.PasswordField(
  20. label="密码",
  21. validators=[
  22. validators.DataRequired(message='该字段不能为空'),
  23. validators.Length(min=6, max=12, message='用户名必须6-12个字符')
  24. ],
  25. id="pwd",
  26. render_kw={"class": "pwd"}
  27. )
  28. repassword = simple.PasswordField(
  29. label="确认密码",
  30. validators=[
  31. validators.EqualTo(fieldname='password', message='两次密码不一致')
  32. ],
  33. id="re_pwd",
  34. render_kw={"class": "re_pwd"}
  35. )
  36. email = simple.StringField(
  37. label="邮箱",
  38. validators=[
  39. validators.DataRequired(message='该字段不能为空'),
  40. validators.Email(message='必须符合邮箱格式')
  41. ],
  42. id="email",
  43. render_kw={"class": "email"}
  44. )
  45. gender = core.RadioField(
  46. label='性别',
  47. coerce=int, # 提交的数据类型,即1或者2的数据类型
  48. choices=(
  49. (1, '女'), # 元组第一个元素是value,第二个元素是显示的值
  50. (2, '男')
  51. ),
  52. default=1 # 默认值为1
  53. )
  54. hobby = core.SelectMultipleField(
  55. label='爱好',
  56. validators=[validators.Length(min=1, max=3, message='爱好可为1-3个')],
  57. coerce=str, # 注意,类型为str时,下面choices中每个元组第一个值必须带引号
  58. choices=(
  59. ('', '足球'),
  60. ('', '篮球'),
  61. ('', '唱歌'),
  62. ('', '跳舞')
  63. ),
  64. default=(1,3) # 默认选中两个
  65. )
  66. # button = simple.SubmitField() # 渲染提交按钮
  67.  
  68. # 定义登陆类
  69. class LoginForm(Form):
  70. username = simple.StringField(
  71. label="用户名", # lable标签标记内容
  72. validators=[
  73. validators.DataRequired(message='该字段不能为空'),
  74. validators.Length(min=3, max=10, message='用户名必须3-10个字符')
  75. ], # 校验条件,可迭代条件,因为可能校验多个条件
  76. description='this is a description', # 描述标记
  77. id="user_id", # 标签id
  78. widget=None, # 默认组件(比如input type="text") 在StringField中已经被实例化了
  79. render_kw={"class":"my_login"} # 添加属性和值
  80. )
  81. password = simple.PasswordField(
  82. label="密码",
  83. validators=[
  84. validators.DataRequired(message='该字段不能为空'),
  85. validators.Length(min=6, max=12, message='用户名必须6-12个字符')
  86. ],
  87. description='this is a description',
  88. id="pwd",
  89. default=None,
  90. render_kw={"class": "pwd"}
  91. )
  92.  
  93. @app.route("/reg", methods=["GET", "POST"])
  94. def reg():
  95. if request.method == "GET":
  96. rf = RegForm()
  97. return render_template('reg.html', wtf=rf)
  98. else:
  99. rf = RegForm(request.form)
  100. if rf.validate():
  101. return rf.data.get('username')
  102. else:
  103. print(rf.data)
  104. print(rf.errors)
  105. return render_template('reg.html', wtf=rf)
  106.  
  107. @app.route("/login", methods=["GET", "POST"])
  108. def login():
  109. if request.method == "GET":
  110. lf = LoginForm() # 实例化登录类
  111. return render_template('index.html', wtf=lf)
  112. else:
  113. lf = LoginForm(request.form) # 将用户提交数据传入登陆类
  114. if lf.validate(): # 校验用户提交的数据
  115. return lf.data.get('username') # 正确的在lf.data中
  116. else: # 错误的在lf.errors中
  117. return render_template('index.html', wtf=lf)
  118.  
  119. app.run(debug=True)

  reg.html文件:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>注册</title>
  6. </head>
  7. <body>
  8. <form action="" method="post" novalidate>
  9. {% for field in wtf %}
  10. <p>
  11. {{ field.label }}
  12. {{ field }}
  13. {{ field.errors.0 }}
  14. </p>
  15. {% endfor %}
  16. <input type="submit" value="注册">
  17. </form>
  18. </body>
  19. </html>

  login.html文件:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>登录</title>
  6. </head>
  7. <body>
  8. <form action="" method="post" novalidate>
  9. <p>
  10. {{ wtf.username.label }}
  11. {{ wtf.username }}{{ wtf.username.errors.0 }}
  12. </p>
  13. <p>
  14. {{ wtf.password.label }}
  15. {{ wtf.password }}{{ wtf.password.errors.0 }}
  16. </p>
  17. <input type="submit" value="登录">
  18. </form>
  19. </body>
  20. </html>

三、数据库连接池(POOL)

1、回顾pymysql(python操作数据库的模块)的使用

  参考博客:https://www.cnblogs.com/li-li/p/9810867.html

2、DBUtils - python数据库连接池

  1)安装DBUtils

  1. pip3 install DBUtils

  2)创建并使用连接池

    dbpool.py文件:

  1. import pymysql
  2. from DBUtils.PooledDB import PooledDB
  3.  
  4. POOL = PooledDB(
  5. creator=pymysql, # 使用链接数据库的模块
  6. maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
  7. mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
  8. maxcached=5, # 链接池中最多闲置的链接,0和None不限制
  9. maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
  10. blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
  11. maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
  12. setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
  13. ping=0,
  14. # ping MySQL服务端,检查是否服务可用。
  15. # 如:0 = None = never,
  16. # 1 = default = whenever it is requested,
  17. # 2 = when a cursor is created,
  18. # 4 = when a query is executed,
  19. # 7 = always
  20. host="127.0.0.1",
  21. port=3306,
  22. user="root",
  23. password="",
  24. charset="utf8",
  25. db="s15"
  26. )

    sqlhelper.py文件:

  1. from dbpool import POOL
  2. import pymysql
  3.  
  4. def create_conn():
  5. conn = POOL.connection()
  6. cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
  7.  
  8. return conn,cursor
  9.  
  10. def close_conn(conn,cursor):
  11. cursor.close()
  12. conn.close()
  13.  
  14. def insert(sql,args):
  15. conn,cursor = create_conn()
  16. res = cursor.execute(sql,args)
  17. conn.commit()
  18. close_conn(conn,cursor)
  19. return res
  20.  
  21. def fetch_one(sql,args):
  22. conn,cursor = create_conn()
  23. cursor.execute(sql,args)
  24. res = cursor.fetchone()
  25. close_conn(conn,cursor)
  26. return res
  27.  
  28. def fetch_all(sql,args):
  29. conn,cursor = create_conn()
  30. cursor.execute(sql,args)
  31. res = cursor.fetchall()
  32. close_conn(conn,cursor)
  33. return res
  34.  
  35. sql = "insert into users(name,age) VALUES (%s, %s)"
  36. insert(sql,("mjj",9))
  37.  
  38. sql = "select * from users where name=%s and age=%s"
  39. print(fetch_one(sql,("mjj",9)))

 

Flask(5)- Flask-Session组件、WTForms组件、数据库连接池(POOL)的更多相关文章

  1. Flask(4):wtforms组件 & 数据库连接池 DBUtils

    wtforms 组件的作用: --- 生成 HTML 标签 --- form 表单验证 示例代码: app.py from flask import Flask, render_template, r ...

  2. Flask&&人工智能AI --5 Flask-session、WTForms、数据库连接池、Websocket

    未完待续.... DButils 什么是数据库连接池 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库 ...

  3. flask数据库连接池DBUtils

    数据库连接池 为啥要使用数据库连接池 频繁的连接和断开数据库,消耗大,效率低 DBUtils可以创建多个线程连接数据库,且一直保持连接,不会断开 执行数据库操作时,由数据池分配线程,当数据池空时,可选 ...

  4. 基于DBUtils实现数据库连接池及flask项目部署

    阅读目录 flask中是没有ORM的,如果在flask里面连接数据库有两种方式 数据库连接池原理 模式一: 模式二: 数据库连接池 flask中是没有ORM的,如果在flask里面连接数据库有两种方式 ...

  5. [数据库连接池] Java数据库连接池--DBCP浅析.

    前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用数据库连接池假设网站一天有很大的访问量,数据库服务 ...

  6. java数据库连接池技术简单使用

    JDBCDemo.java: package com.itheima.jdbc; import java.sql.Connection; import java.sql.PreparedStateme ...

  7. Java数据库连接池--DBCP浅析.

    一. 为何要使用数据库连接池假设网站一天有很大的访问量,数据库服务器就需要为每次连接创建一次数据库连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.拓机.数据库连接是一种关键的有限的昂贵 ...

  8. Flask Session ,pymysql ,wtforms组件 虚拟virtualenv venv

    https://www.cnblogs.com/wupeiqi/articles/5713330.html session def create_app(): print() app=Flask(__ ...

  9. flask wtforms组件详解

    一.简介 在flask内部并没有提供全面的表单验证,所以当我们不借助第三方插件来处理时候代码会显得混乱,而官方推荐的一个表单验证插件就是wtforms.wtfroms是一个支持多种web框架的form ...

随机推荐

  1. go context包的WithTimeout和WithCancel的使用

    1.WaitGroup 它是一种控制并发的方式,它的这种方式是控制多个goroutine同时完成. func main() { var wg sync.WaitGroup wg.Add(2) go f ...

  2. 利用RPM和YUM安装软件

    安装软件事root的事,所以必须要以root身份登录! 假设我要安装一个文件名为rp-pppoe-3.5-32.1.i386.rpm的文件, 那么我们可以这样: rpm安装软件 rpm -ivh pa ...

  3. ARP-Address Resolution Protocol-地址解析协议

    主要内容摘自:图解TCP/IP ARP是一种解决地址问题的协议.以目标IP地址为线索,用来定位下一个应该接受数据分包的网络设备的mac地址. 如果目标主机不在同一个链路上时,可以通过ARP查找下一跳路 ...

  4. 线程池 (thread pool) 的类型与实现方式

    在许多应用中需要频繁的创建许多生命周期很短的线程,如果用传统方法的话就会造成大量的资源了浪费,java的设计者们考虑到了这点在java中加入了线程池这个特性,它负责管理大量的线程的创建销毁等操作. 首 ...

  5. nginx-1.14.0安装

    1.百度搜索Nginx,点击Nginx news官网,点击nginx-1.13.10进入下载网页,选择Stable version的版本之后下载. 2.进入根目录,cd / 3.在根目录下创建soft ...

  6. Socket创建失败:10093错误

    10093的错误,应用程序没有调用 WSAStartup,或者 WSAStartup 失败. 问题描述:Failed to create UDP socket:10093!Close and rest ...

  7. HBase MemStore与HStoreFile 的大小分析

    Sumary: MemStore结构 KeyValue构成细节 HFile分析 Maven 项目例子使用了Maven来管理Dependency,要运行例子,需要有maven环境,后面提到的HFile, ...

  8. 简要描述如何结合struts、hibernate、spring开发Web应用?

    简要描述如何结合struts.hibernate.spring开发Web应用? 解答:Struts可以将jsp页面的表单关联起来,就是把JSP页面的表单数据封装成javaBean,这样的话,在acti ...

  9. 在mybatis 中批量加载mapper.xml

    可以直接加载一个包文件名,将这个包里的所有*mapper.xml文件加载进来. 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载: 必须按一定的标准:即xml文件和 ...

  10. CentOS 7如何设置Linux开机自动获取IP地址

    centos7 minimal版默认安装好后没有获取ip地址,需要手动配置.方法如下: 1.输入“ip addr”并按回车键确定,发现无法获取IP(CentOS 7默认没有ifconfig命令),记录 ...