上篇我们大概简单描述了一下上下文管理,这篇来具体来说说,

  1. 上下管理的request
  2. 上下管理的session
  3. 第三方组件:flask-session
  4. pymysql操作数据库  数据库连接池

一、前奏

1、一个新名词:偏函数   (可以帮你自动传参数)

import functools   #装饰器用过的模块

def index(a,b):
return a+b new_fun=functools.partial(index,666) #666当作第一个参数 #原来的调用
# ret=index(1,2)
#
# print(ret)
ret=new_fun(1) #偏函数,帮助开发者自动传递参数
print(ret)

2、super和执行类的区别?

class Base(object):

    def func(self):
print('Base.func') class Foo(Base):
def func(self):
#方式一:根据mro的顺序执行方法
# super().func()
#方式二:主动执行Base类的方法
# Base.func(self)
print('Foo.func') obj=Foo()
obj.func()
print(obj.__mro__)

3、面向对象中特殊方法 setattr/getattr注意事项:

class Foo(object):
def __init__(self):
#self.duoduo={} 直接定于会发现调用__setattr__方法时,还没有生成会报错
object.__setattr__(self,'duoduo',{}) def __setattr__(self, key, value):
print(key,value,self.duoduo) obj=Foo()
print(obj.duoduo)

四、栈

基于列表实现的一个栈:

class Stack(object):

    def __init__(self):
self.data=[] def push(self,val):
self.data.append(val) def pop(self):
return self.data.pop() _stack=Stack()
_stack.push('大娃')
_stack.push('二娃') print(_stack.pop())
print(_stack.pop())

5、Local类

try:
from greenlet import getcurrent as get_ident #获取协程的唯一标记
except:
from threading import get_ident #获取线程的唯一标记 class Local(object): def __init__(self):
object.__setattr__(self,'storage',{}) def __setattr__(self, key, value):
ident=get_ident()
if ident not in self.storage:
self.storage[ident]={key,value}
else:
self.storage[ident][key]=value def __getattr__(self, item):
ident=get_ident()
if ident in self.storage:
return self.storage[ident].get(item)

这个是我们自己写的,我们再去看看flask中的Local类

from flask import globals  #点globals

_request_ctx_stack = LocalStack()  #点LocalStack()

self._local = Local()   #点Local

先看看上面导入的模块:一样的,优先协程,然后线程

__slots__,只能访问什么属性的范围

6、全局变量只有在初次加载时执行

二、上下文管理 request

1、wsgi   初步处理请求

2 、 __call__方法   执行wsgi_app

3、ctx=RequestContextsession,request)   再执行  ctx.push()

4、LocalStack对象 把ctx对象添加到local中

5、Local     存数据的时__storage__={'唯一标识':{stack:[ctx,]}}

6、视图函数

上下文管理:session

就一个流程,别的基本上一样,

最后通过localstack获取ctx中的session,给session赋值(从cookie中读取数据)

三、flask-session

先下载第三方的库

pip3 install  flask-session

用法:

import redis
from flask import Flask
from flask.sessions import SecureCookieSessionInterface
from flask_session import Session duo=Flask(__name__) #duo.session_interface=SecureCookieSessionInterface()
#duo.session_interface=RedisSessionInterface()
duo.config['SESSION_TYPE']='redis'
duo.config['SESSION_TYPE']=redis.Redis(host='11.1.11.1',port=6379,password='')
Session(duo)

我们来看看Session里面是什么:

app.session_interface赋值,再来看看sef._get_interface(app)

这下我们来说说他的原理:

最开始请求进来的时候,这时是根本没有sesiion,找到他的session,执行open_session

执行完open_session,就要保存在浏览器上执行save_session

保存好后,下次再来访问:

总结:

  1. session 数据保存到redis   session:随机字符串(每个线程或协程都不一样)
  2. 随机字符串返回给用户

查看源码

from flask_session import RedisSessionInterface

四、数据库连接池

pip3 install DBUtils

创建一批连接到连接池,供所有线程共享使用。

import time
import pymysql
import threading
from DBUtils.PooledDB import PooledDB, SharedDBConnection
POOL = 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=[], # 开始会话前执行的命令列表。如:["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 = always
host='127.0.0.1',
port=3306,
user='root',
password='',
database='db',
charset='utf8'
) def func():
# 检测当前正在运行连接数的是否小于最大链接数,如果不小于则:等待或报raise TooManyConnections异常
# 否则
# 则优先去初始化时创建的链接中获取链接 SteadyDBConnection。
# 然后将SteadyDBConnection对象封装到PooledDedicatedDBConnection中并返回。
# 如果最开始创建的链接没有链接,则去创建一个SteadyDBConnection对象,再封装到PooledDedicatedDBConnection中并返回。
# 一旦关闭链接后,连接就返回到连接池让后续线程继续使用。
conn = POOL.connection()
cursor = conn.cursor(pymysql.cursors.DictCursor) #pymsql
cursor.execute('select * from tb1')
result = cursor.fetchall()
conn.close() func()

注意:

  使用数据库要用连接池

   封装SQLHelper

python3-开发进阶Flask的基础(3)的更多相关文章

  1. python3开发进阶-Web框架的前奏

    我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 1.自定义web框架 import socket ...

  2. python3-开发进阶Flask的基础(5)

    内容概要: SQLAlchemy flsak-sqlalchemy flask-script flask-migrate Flask的目录结构 一.SQLAlchemy 1.概述 SQLAlchemy ...

  3. python3-开发进阶Flask的基础

    一.概述 最大的特点:短小精悍.可拓展强的一个Web框架.注意点:上下文管理机制,依赖wsgi:werkzurg 模块 二.前奏学习werkzurg 先来回顾一个知识点:一个类加括号会执行__init ...

  4. python3开发进阶-Django框架的起飞加速一(ORM)

    阅读目录 ORM介绍 Django中的ORM ORM中的Model ORM的操作 一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一 ...

  5. python3开发进阶-Django框架起飞前的准备

    阅读目录 安装 创建项目 运行 文件配置的说明 三个组件 一.安装(安装最新LTS版) Django官网下载页面 根据官方的图版本,我们下载1.11版本的,最好用! 有两种下载方式一种直接cmd里: ...

  6. python3-开发进阶Flask的基础(4)

    今日内容: 上下文管理:LocalProxy对象 上下文管理:  请求上下文: request/session   app上下文:app/g 第三方组件:wtforms       1.使用      ...

  7. python3-开发进阶Flask的基础(2)

    知识回顾 1.django 和flask区别? 最大的不同就是django请求相关的数据,通过参数一个一个传递过去的,而flask就是先把放在某个地方,然后去取,这个东西叫上下文管理 2.什么是wsg ...

  8. python3开发进阶-Django框架的自带认证功能auth模块和User对象的基本操作

    阅读目录 auth模块 User对象 认证进阶 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其 ...

  9. python3开发进阶-Django框架的Form表单系统和基本操作

    阅读目录 什么是Form组件 常用字段和插件 自定义校验的方式 补充进阶 一.什么是Form组件 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标 ...

随机推荐

  1. HDU 2044 Coins

    有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示.   Input输入数据的第一行是一个整数N,表示测试实例的个数,然 ...

  2. Go语言 8 反射

    文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 8.1概念和作用 Reflection(反射)在计算 ...

  3. 千字短文解决工程师们关于SPI的迷糊!

    串行外设接口 (SPI) 总线是一个工作在全双工模式下的同步串行数据链路.它可用于在单个主控制器和一个或多个从设备之间交换数据.其简单的实施方案只使用四条支持数据与控制的信号线(图 1): 图1:基本 ...

  4. Linux系统中提示/usr/bin/ld: cannot find -lxxx错误的通用解决方法

    在linux环境编译应用程式或lib的source code时常常会出现如下的错误讯息: 代码如下: /usr/bin/ld: cannot find -lxxx 这些讯息会随着编译不同类型的sour ...

  5. VS2015_动态链接库学习

    非MFC动态链接库 创建一个名为ex1的Win32项目 创建一个DLL项目,保留预编译的头文件   默认文件 创建完成项目之后,包含几个默认的文件   stdafx.h文件用于包含标准系统包含的头文件 ...

  6. web deploy 安装失败解决

    单独运行安装包,提示脚本运行失败. VS安装提示解包失败. 解决:检查Windows Management Instrumentation服务状态.需要非禁用.

  7. 使用非root用户启动tomcat

    以下操作均为以root用户运行1.添加tomcat用户组 /usr/sbin/groupadd tomcat 2.添加tomcat用户,并限制登录 /usr/sbin/useradd -s /bin/ ...

  8. 设置或者获取CheckboxList控件的选中值

    1.设置CheckBoxList选中的值 /// <summary> /// 设置CheckBoxList中哪些是选中了的 /// </summary> /// <par ...

  9. ubuntu怎么连接centos远程桌面

    1.系统软件设置CentOS端:查看是否安装了vnc软件# rpm -q vnc vnc-serverpackage vnc is not installedvnc-server-4.1.2-14.e ...

  10. 2017 计蒜之道 初赛 第五场 C. UCloud 的安全秘钥(中等)

    暴力. $O(m*n)$的算法可以通过此题,每次询问$O(m)$扫$S$数组,统计不同数字的个数,每次移动最多只会变化两个数字,如果不同数字个数为$0$,那么答案加$1$. #include < ...