一、偏函数

当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

  1. from functools import partial
  2. def func(a1,a2,a3):
  3. print(a1,a2,a3)
  4. new_func1 = partial(func,a1=1,a2=2)
  5. new_func1(a3=3) # 额外传值
  6. new_func2 = partial(func,1,2)
  7. new_func2(3)
  8. new_func3 = partial(func,a1=1)
  9. new_func3(a2=2,a3=3)

二、g对象

专门用来存储用户信息的g对象,g的全称的为global

g对象在一次请求中的所有的代码的地方,都是可以使用的

作用:防止和request内部的属性混乱,比如不知道request里面有没有name属性,可以直接g.name设值。只对这个请求设值

  1. from flask import Flask, g
  2. app = Flask(__name__)
  3. @app.before_request
  4. def be():
  5. g.name = 'jeff'
  6. print('befor1')
  7. @app.route('/')
  8. def index():
  9. print(g.name)
  10. return 'ok'
  11. @app.route('/login')
  12. def login():
  13. print(g.name)
  14. return 'ok'
  15. if __name__ == '__main__':
  16. app.run()

g对象和session的区别

  1. session对象是可以跨request的,只要session还未失效,不同的request的请求会获取到同一个session,但是g对象不是,g对象不需要管过期时间,请求一次就g对象就改变了一次,或者重新赋值了一次

三、flask-session

作用:将默认保存的签名cookie中的值 保存到 redis/memcached/file/Mongodb/SQLAlchemy

安装:pip3 install flask-session

使用1:

  1. from flask import Flask,session
  2. from flask_session import RedisSessionInterface
  3. import redis
  4. app = Flask(__name__)
  5. conn=redis.Redis(host='127.0.0.1',port=6379)
  6. #use_signer是否对key签名
  7. app.session_interface=RedisSessionInterface(conn,key_prefix='lqz')
  8. @app.route('/')
  9. def hello_world():
  10. session['name']='lqz'
  11. return 'Hello World!'
  12. if __name__ == '__main__':
  13. app.run()

使用2:

  1. from redis import Redis
  2. from flask.ext.session import Session
  3. app.config['SESSION_TYPE'] = 'redis'
  4. app.config['SESSION_REDIS'] = Redis(host='192.168.0.94',port='6379')
  5. Session(app)

问题:设置cookie时,如何设定关闭浏览器则cookie失效。

  1. response.set_cookie('k','v',exipre=None)#这样设置即可
  2. #在session中设置
  3. app.session_interface=RedisSessionInterface(conn,key_prefix='lqz',permanent=False)
  4. #一般不用,我们一般都设置超时时间,多长时间后失效

问题:cookie默认超时时间是多少?如何设置超时时间

  1. #源码expires = self.get_expiration_time(app, session)
  2. 'PERMANENT_SESSION_LIFETIME': timedelta(days=31),#这个配置文件控制

四、数据库连接池

pymsql链接数据库

  1. import pymysql
  2. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='s8day127db')
  3. cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
  4. # cursor.execute("select id,name from users where name=%s and pwd=%s",['lqz','123',])
  5. cursor.execute("select id,name from users where name=%(user)s and pwd=%(pwd)s",{'user':'lqz','pwd':'123'})
  6. obj = cursor.fetchone()
  7. conn.commit()
  8. cursor.close()
  9. conn.close()
  10. print(obj)

数据库连接池版

setting.py

  1. from datetime import timedelta
  2. from redis import Redis
  3. import pymysql
  4. from DBUtils.PooledDB import PooledDB, SharedDBConnection
  5. class Config(object):
  6. DEBUG = True
  7. SECRET_KEY = "umsuldfsdflskjdf"
  8. PERMANENT_SESSION_LIFETIME = timedelta(minutes=20)
  9. SESSION_REFRESH_EACH_REQUEST= True
  10. SESSION_TYPE = "redis"
  11. PYMYSQL_POOL = PooledDB(
  12. creator=pymysql, # 使用链接数据库的模块
  13. maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
  14. mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
  15. maxcached=5, # 链接池中最多闲置的链接,0和None不限制
  16. maxshared=3,
  17. # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
  18. blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
  19. maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
  20. setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
  21. ping=0,
  22. # 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
  23. host='127.0.0.1',
  24. port=3306,
  25. user='root',
  26. password='123456',
  27. database='s8day127db',
  28. charset='utf8'
  29. )
  30. class ProductionConfig(Config):
  31. SESSION_REDIS = Redis(host='192.168.0.94', port='6379')
  32. class DevelopmentConfig(Config):
  33. SESSION_REDIS = Redis(host='127.0.0.1', port='6379')
  34. class TestingConfig(Config):
  35. pass

utils/sql.py

  1. import pymysql
  2. from settings import Config
  3. class SQLHelper(object):
  4. @staticmethod
  5. def open(cursor):
  6. POOL = Config.PYMYSQL_POOL
  7. conn = POOL.connection()
  8. cursor = conn.cursor(cursor=cursor)
  9. return conn,cursor
  10. @staticmethod
  11. def close(conn,cursor):
  12. conn.commit()
  13. cursor.close()
  14. conn.close()
  15. @classmethod
  16. def fetch_one(cls,sql,args,cursor =pymysql.cursors.DictCursor):
  17. conn,cursor = cls.open(cursor)
  18. cursor.execute(sql, args)
  19. obj = cursor.fetchone()
  20. cls.close(conn,cursor)
  21. return obj
  22. @classmethod
  23. def fetch_all(cls,sql, args,cursor =pymysql.cursors.DictCursor):
  24. conn, cursor = cls.open(cursor)
  25. cursor.execute(sql, args)
  26. obj = cursor.fetchall()
  27. cls.close(conn, cursor)
  28. return obj

五、信号

Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为

安装:pip3 install blinker

内置信号:

  1. request_started = _signals.signal('request-started') # 请求到来前执行
  2. request_finished = _signals.signal('request-finished') # 请求结束后执行
  3. before_render_template = _signals.signal('before-render-template') # 模板渲染前执行
  4. template_rendered = _signals.signal('template-rendered') # 模板渲染后执行
  5. got_request_exception = _signals.signal('got-request-exception') # 请求执行出现异常时执行
  6. request_tearing_down = _signals.signal('request-tearing-down') # 请求执行完毕后自动执行(无论成功与否)
  7. appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 应用上下文执行完毕后自动执行(无论成功与否)
  8. appcontext_pushed = _signals.signal('appcontext-pushed') # 应用上下文push时执行
  9. appcontext_popped = _signals.signal('appcontext-popped') # 应用上下文pop时执行
  10. message_flashed = _signals.signal('message-flashed') # 调用flask在其中添加数据时,自动触发

使用信号:

  1. from flask import Flask,signals,render_template
  2. app = Flask(__name__)
  3. # 往信号中注册函数
  4. def func(*args,**kwargs):
  5. print('触发型号',args,kwargs)
  6. signals.request_started.connect(func)
  7. # 触发信号: signals.request_started.send()
  8. @app.before_first_request
  9. def before_first1(*args,**kwargs):
  10. pass
  11. @app.before_first_request
  12. def before_first2(*args,**kwargs):
  13. pass
  14. @app.before_request
  15. def before_first3(*args,**kwargs):
  16. pass
  17. @app.route('/',methods=['GET',"POST"])
  18. def index():
  19. print('视图')
  20. return render_template('index.html')
  21. if __name__ == '__main__':
  22. app.wsgi_app
  23. app.run()

一个流程中的信号触发点(了解)

  1. a. before_first_request
  2. b. 触发 request_started 信号
  3. c. before_request
  4. d. 模板渲染
  5. 渲染前的信号 before_render_template.send(app, template=template, context=context)
  6. rv = template.render(context) # 模板渲染
  7. 渲染后的信号 template_rendered.send(app, template=template, context=context)
  8. e. after_request
  9. f. session.save_session()
  10. g. 触发 request_finished信号
  11. 如果上述过程出错:
  12. 触发错误处理信号 got_request_exception.send(self, exception=e)
  13. h. 触发信号 request_tearing_down

自定义信号(了解):

  1. from flask import Flask, current_app, flash, render_template
  2. from flask.signals import _signals
  3. app = Flask(import_name=__name__)
  4. # 自定义信号
  5. xxxxx = _signals.signal('xxxxx')
  6. def func(sender, *args, **kwargs):
  7. print(sender)
  8. # 自定义信号中注册函数
  9. xxxxx.connect(func)
  10. @app.route("/x")
  11. def index():
  12. # 触发信号
  13. xxxxx.send('123123', k1='v1')
  14. return 'Index'
  15. if __name__ == '__main__':
  16. app.run()

六、命令flask-script

用于实现类似于django中 python3 manage.py runserver ...类似的命令

安装:pip3 install flask-script

使用

  1. from flask_script import Manager
  2. app = Flask(__name__)
  3. manager=Manager(app)
  4. ...
  5. if __name__ == '__main__':
  6. manager.run()
  7. #以后在执行,直接:python3 manage.py runserver
  8. #python3 manage.py runserver --help

自定制命令

  1. @manager.command
  2. def custom(arg):
  3. """
  4. 自定义命令
  5. python manage.py custom 123
  6. :param arg:
  7. :return:
  8. """
  9. print(arg)
  10. @manager.option('-n', '--name', dest='name')
  11. #@manager.option('-u', '--url', dest='url')
  12. def cmd(name, url):
  13. """
  14. 自定义命令(-n也可以写成--name)
  15. 执行: python manage.py cmd -n lqz -u http://www.oldboyedu.com
  16. 执行: python manage.py cmd --name lqz --url http://www.oldboyedu.com
  17. :param name:
  18. :param url:
  19. :return:
  20. """
  21. print(name, url)
  22. #有什么用?
  23. #把excel的数据导入数据库,定制个命令,去执行

七、flask-admin

安装

  1. pip3 install flask_admin

简单使用

  1. from flask import Flask
  2. from flask_admin import Admin
  3. app = Flask(__name__)
  4. #将app注册到adminzhong
  5. admin = Admin(app)
  6. if __name__=="mian":
  7. app.run()
  8. #访问
  9. #127.0.0.1:5000/admin端口,会得到一个空白的页面

将表模型注册到admin中

  1. #在将表注册之前应该对app进行配置
  2. SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:@127.0.0.1:3307/py9api?charset=utf8mb4"
  3. SQLALCHEMY_POOL_SIZE = 5
  4. SQLALCHEMY_POOL_TIMEOUT = 30
  5. SQLALCHEMY_POOL_RECYCLE = -1
  6. #导入models文件的中的表模型
  7. from flask_admin.contrib.sqla import ModelView
  8. from api.models import Stock,Product,Images,Category,Wxuser,Banner
  9. admin.add_view(ModelView(Stock, db.session))
  10. admin.add_view(ModelView(Product, db.session))
  11. admin.add_view(ModelView(Category, db.session))

如果有个字段是图片指端

  1. #配置上传文件的路径
  2. #导入from flask_admin.contrib.fileadmin import FileAdmin
  3. from flask_admin.contrib.fileadmin import FileAdmin,form
  4. file_path = op.join(op.dirname(__file__), 'static')
  5. admin = Admin(app)
  6. admin.add_view(FileAdmin(file_path, '/static/', name='文件'))
  7. #如果有个字段要是上传文件重写该方法的modleView类,假设imgae_url是文件图片的字段
  8. class ImagesView(ModelView):
  9. form_extra_fields = {
  10. 'image_url': form.ImageUploadField('Image',
  11. base_path=file_path,
  12. relative_path='uploadFile/'
  13. )
  14. }
  15. admin.add_view(ImagesView(Images, db.session))

Flask 偏函数、g对象、flask-session、数据库连接池、信号、自制命令、flask-admin的更多相关文章

  1. flask的g对象

    故名思议我们可以理解这个g对象是一个全局的对象,这个对象存储的是我们这一次请求的所有的信息,只是存储这一次的请求 g:global 1. g对象是专门用来保存用户的数据的.  2. g对象在一次请求中 ...

  2. Flask中g对象,以及g,session,flash之间的区别

    一.g对象的使用 专门用来存储用户信息的g对象,g的全称的为global g对象在一次请求中的所有的代码的地方,都是可以使用的 g对象的使用: 设置:g.变量名= 变量值 获取:g.name 注意:g ...

  3. Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号

    Flask框架 (四)—— 请求上下文源码分析.g对象.第三方插件(flask_session.flask_script.wtforms).信号 目录 请求上下文源码分析.g对象.第三方插件(flas ...

  4. flask框架(七)——蓝图、请求上下文、g对象、信号、flask_session

    蓝图 作用:对程序进行目录结构划分 不使用蓝图情况下,自己分文件 目录结构: -templates -views -__init__.py -user.py -order.py -app.py app ...

  5. Flask中current_app和g对象

      Flask零基础到项目实战(七)请求方法.g对象和钩子函数 一.get方法 二.post方法 post请求在模板中要注意几点: input标签中,要写name来标识这个value的key,方便后台 ...

  6. Flask g 对象

    1.什么是g对象? 在 flask 中,有一个专门用来存储用户信息的 g 对象,g的全称的为global. g 对象在一次请求中的所有的代码的地方,都是可以使用的. 赋值方式 from flask i ...

  7. Flask初学者:g对象,hook钩子函数

    Flask的g对象 作用:g可以可以看作是单词global的缩写,使用“from flask import g”导入,g对象的作用是保存一些在一次请求中多个地方的都需要用到的数据,这些数据可能在用到的 ...

  8. flask g对象

    g对象  一次请求中使用 下面用redirect重定向,不是同一次请求了 g:global 1. g对象是专门用来保存用户的数据的. 2. g对象在一次请求中的所有的代码的地方,都是可以使用的. 使用 ...

  9. Flask(六)—— 自定义session

    Flask(六)—— 自定义session import uuid import json from flask.sessions import SessionInterface from flask ...

随机推荐

  1. jmeter压测遇到的问题

    一.今天压力测试时,开始12秒后出现了很多异常, 都是 java.net.NoRouteToHostException: Cannot assign requested address. 1.首先我这 ...

  2. leetcode 1.回文数-(easy)

    2019.7.11leetcode刷题 难度 easy 题目名称 回文数 题目摘要 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 思路 一些一定不为回文数的 ...

  3. Web of science|SCIE|影响因子|SSCI|高被引论文|领域中热点论文|

    信息检索: 数据库 Web of science 影响因子只是针对期刊打分,并不是对文章打分.所以对文章评价可以看引用次数. SCIE (Science Citation Index Expanded ...

  4. Elegy written in a country church-yard

    分享一首好诗:托马斯·格雷的<墓地哀歌>. "ELEGY WRITTEN IN A COUNTRY CHURCH-YARD" The curfew tolls the ...

  5. 华为云linux服务器部署TensorFlow-gpu全攻略

    最近在玩谷歌新开源的自然语言模型bert,最开始是在google的免费GPU上面来弄的(这个部分其实也是可以写一个教程的,中间坑也挺多).但谷歌比较坑人,小数据集还行,大点的数据集训练耗费时间长,再加 ...

  6. 将js进行到底:node学习7

    Node.js之Websocket技术 我第一次听说websocket之时,HTML5标准尚未公布,当时只有少数前瞻性浏览器携带了这个API. 我对websocket最大的印象是,他可以解决我对&qu ...

  7. MongoDB启动.mongorc.js报错解决方法

    在bin目录下输入./mongo --norc 不去加载.mongorc.js

  8. myeclipse安装插件svn的步骤

    下载插件地址:http://subclipse.tigris.org/ 方法一:本地安装 1.打开HELP->MyEclipse Configuration或者myeclipse->MyE ...

  9. Vue.js——学习笔记(一)

    Vue-自学笔记 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅 ...

  10. 优秀的Spring Cloud开源项目整理推荐

    无论是对于初学者,还是有一定工作经验的程序员来讲,Spring Cloud开源项目都是一笔宝贵的财富.下面给大家整理了十个优秀的开源项目,分别是spring-cloud-examples.spaasc ...