flask测试

测试 Testing Flask Applications Testing Flask Applications中文翻译 pytest相关文档 @pytest.fixture @pytest.mark.parametrize pytest的一个系列教程 要点提炼 Flask提供的测试渠道是使用Werkzeug的Client类 文件结构: 在应用的根文件夹中添加一个测试文件夹tests, 在里面新建各个测试脚本,名称类似test_*.py的文件会被 pytest 自动发现 conftest.py为全局配置文件,我们可以在里面实例化测试用的client和已经登陆了的client pytest的teardown是通过生成器返回执行对应语句实现的

created: 2020-03-21  |  updated: 2020-03-25  |  阿秀

Python sys包

前言 sys模块提供了一些变量和函数。这些变量可能被解释器使用,也可能由解释器提供。这些函数会影响解释器. 文档地址 这篇文章给常用的一些变量做笔记 sys.argv 一个列表,其中包含了被传递给 Python 脚本的命令行参数。 argv[0]为脚本的名称(是否是完整的路径名取决于操作系统)。如果是通过Python解释器的命令行参数-c来执行的, argv[0]会被设置成字符串 '-c' 。如果没有脚本名被传递给Python解释器, argv[0]为空字符串。 其他选项存在后续下标中,如python main.py -a -b,argv[1]为-a 为了遍历标准输入,或者通过命令行传递的文件列表,参照fileinput模块 sys.exec_prefix 一个字符串,提供特定域的目录前缀,该目录中安装了与平台相关的 Python 文件,默认也是'/usr/local'。 该目录前缀可以在构建时使用configure脚本的--exec-prefix参数进行设置。 具体而言,所有配置文件(如 pyconfig.h 头文件)都安装在目录 exec_prefix/lib/pythonX.Y/config中,共享库模块安装在 exec_prefix/lib/pythonX.Y/lib-dynload中,其中 X.Y 是 Python 的版本号,如 3.2。 sys.base_exec_prefix base_exec_prefix在python启动的时候且在site.py运行之前被设置,和exec_prefix有相同的值(当不使用虚拟环境时) 如果使用了虚拟环境,prefix和exec_prefix会被改变,用于指向虚拟环境 base_prefix和base_exec_prefix会保持指向安装在系统中的python sys.base_prefix base_prefix在python启动的时候且在site.py运行之前被设置,和prefix有相同的值(当不使用虚拟环境时) 如果使用了虚拟环境,prefix和exec_prefix会被改变,用于指向虚拟环境 base_prefix和base_exec_prefix会保持指向安装在系统中的python sys.builtin_module_names 一个元组,包含了所有被编译进了python解释器的模块 sys.exc_info() 本函数返回一个(type, value, traceback)元组: type是正在处理的异常类型(它是BaseException的子类) value是异常实例(异常类型的实例) traceback 是一个回溯对象,该对象封装了最初发生异常时的调用堆栈。 如果整个堆栈都没有正在处理的异常,则以上3个值均为None 返回的信息仅限于当前线程和当前堆栈帧。如果当前堆栈帧没有正在处理的异常,则信息将从下级被调用的堆栈帧或上级调用者等位置获取,依此类推,直到找到正在处理异常的堆栈帧为止。此处的“处理异常”指的是“执行 except 子句”。任何堆栈帧都只能访问当前正在处理的异常的信息。 sys.last_type, sys.last_value, sys.last_traceback 这些变量的含义与上述exc_info()返回值的含义相同, 它们并非总是有定义,仅当有异常未处理,且解释器打印了错误消息和堆栈回溯时,才会给它们赋值。它们的预期用途,是允许交互中的用户导入调试器模块,进行事后调试,而不必重新运行导致错误的命令。...

created: 2020-03-20  |  updated: 2020-03-20  |  阿秀

celery

安装 安装celery包 选一个broker,这里我选rabbitmq 选一个backend,这里我选redis python环境下需要安装redis包 插件 flower可以实时监控celery状态 配置 1 2 3 poetry add celery docker run -d -p 5672:5672 rabbitmq docker run -d -p 6379:6379 redis 配置文件celeryconfig.py: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 broker_url = 'pyamqp://guest:guest@localhost' result_backend = 'rpc://' task_serializer = 'json' result_serializer = 'json' accept_content = ['json'] timezone = 'Europe/Oslo' enable_utc = True task_routes = { 'task....

created: 2020-02-26  |  updated: 2020-02-26  |  阿秀

python asyncio

使用async关键字的原生协程 异步生成器(在async def中使用yield),例如: 1 2 async def async_gen(): yield 1 协程函数(即协程),例如: 1 2 3 async def cor(): res = await awaitable() return res 其中awaitable()指的是实现了__await__()协议的对象 协程的一个例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import asyncio async def cor_1(n): return list(range(n)) async def cor_2(n): return list(range(n)) async def chain(m, n): r1 = await cor_1(m) r2 = await cor_2(n) print(r1, r2) async def main(): await asyncio....

created: 2020-02-10  |  updated: 2020-02-10  |  阿秀

Python 基于生成器的协程

从生成器到协程 python的协程是从yield和yield from发展而来的,因为yield一开始是用来实现生成器的,为了使得协程不是某种生成器,在python 3.5开始提出使用新关键字async和await来实现了原生协程。 基于生成器的协程 使用yield实现的协程是基于生成器的,将在3.10弃用。建议没接触过python协程的直接接触async声明的原生协程 一个简单的协程例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def cor(init): index = init while True: recv = yield f'now at index {index}' print(f'recv: {recv}') index += 1 c = cor(init=0) c.send(None) r1 = c.send('1') print(r1) r2 = c.send('2') print(r2) send()是实现协程的一个核心点 协程的参数用于协程开始之前进行相关初始化操作。 协程中表达式recv = yield result, 其中result是协程的返回值(没有result时表示没有返回值),而recv是用来接收外部传入到协程中的数据 一个注意的点是,程序的运行顺序是先接收数据,再返回值,即index+=1后再返回给r1 使用装饰器预激活协程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 from functools import wraps def decorator(coroutine): @wraps(coroutine) def func(*args, **kwargs): primed_cor = coroutine(*args, **kwargs) primed_cor....

created: 2018-03-10  |  updated: 2018-03-10  |  阿秀

Python 位置参数,关键字参数, 默认参数, 可变长位置参数,可变长关键字参数

假设这里有一简单的函数 1 2 def printf(first, second, third): print(first, second) 位置参数 位置参数指的是调用函数时,参数顺序相一致 1 2 printf(1, 2, 3) print(4, 5, 6) 关键字参数 关键字参数指使用键值对key=value这样的方式调用程序 1 printf(first=1, second=2, third=3) 需要注意的是,当你使用关键字参数这种传递方式后,该函数后续参数将不能使用位置参数这一形式进行传递,如: 1 2 printf(first=1, 2, 3) # 错误 printf(1, second=2, third=3) # 正确 即保证位置参数必须放在关键字参数前。类似的,若函数中含默认参数,则后续参数也必须为含默认参数的参数 1 2 3 4 5 def func(first, second=2, third): # 错误 pass def func(first, second=2, third=3): # 正确 pass 除此之外,关键字参数的顺序可以打乱(位置参数顺序不可以改变):...

created: 2017-10-10  |  updated: 2017-10-10  |  阿秀

《Fluent Python》目录

intro 《Fluent Python》这本书前大半部分不错,但偏重点是讲技巧,讲习惯,讲约定 目录索引 第01章 Python数据模型 第02章 数据结构 第03章 字典和集合 第04章 文本和字节序列 第05章 一等函数 第06章 使用一等函数实现设计模式 第07章 函数装饰器和闭包 第08章 对象引用、可变性和垃圾回收 第09章 符合Python风格的对象 第10章 序列的修改、散列和切片 第11章 接口,从协议到抽象基类 第12章 继承的优缺点 第13章 正确重载运算符 第14章 可迭代对象、迭代器和生成器 第15章 上下文管理器和else块 第16章 协程 第17章 使用concurrent.futures处理并发 第18章 使用asyncio包处理并发

created: 2023-04-04  |  updated: 2023-04-04  |  阿秀

《Fluent Python》第01章 python数据模型

namedtuple 第二个参数传入一个字符串, namedtuple将创建一个Point类,且这个类有x和y这两个属性 1 2 3 4 import collections Point = collections.namedtuple('Point', 'x y') O = Point(0, 0) print(O) 特殊方法一览 __repr__ 和 __str__的区别 __repr__ 返回的字符串应该准确、无歧义并且尽可能的表达出特定对象的特征,如Point(1, 2), 即包含特定属性值 __str__是在print()以及str()的时候使用 当一个类没有__str__函数时,将调用__repr__ 自定义类的布尔值 默认情况下我们自己定义的类的实例总被认为是True的,除非这个类对__bool__或者__len__函数有自己的实现 len()为什么不是一个普通方法 len()之所以不是一个普通方法是为了让python自带的数据结构可以走后门(CPython直接从一个C结构体读取对象的长度)

created: 2023-04-04  |  updated: 2023-04-04  |  阿秀