Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在flask测试请求上下文中激发多个请求

在flask测试请求上下文中激发多个请求
EN

Stack Overflow用户
提问于 2017-08-22 15:04:39
回答 2查看 1.7K关注 0票数 1

我目前正在为一个flask应用程序编写单元测试,该应用程序需要在测试期间保持打开的会话。为此,我发现我可以使用test_request_context。在我需要发出多个请求之前,这种方法工作得很好。

我当前的测试处理的是登录/注销系统,我需要确保当用户单击注销按钮时,会话中的某些属性实际上是重置的。

我的代码的一个粗略示例:

代码语言:javascript
运行
AI代码解释
复制
from unittest import TestCase
from flask import Flask, session
from mypackage import auth_blueprint


class FlaskTestCase(TestCase):
    def setUp(self):
        self.app = Flask(__name__)
        self.app.secret_key = urandom(24)
        self.app.register_blueprint(auth_blueprint)   # The blueprint to test
        self.client = self.app.test_client()

    def test_login_logout():
        with self.app.test_request_context("/auth/login", data={"username": "foo", "password": "bar"}, method="POST"):
            assert session["logged_in"]
            # How would I make A call to logout?
            # self.client.post("/auth/logout") doesn't work
            assert not session["logged_in"]

有人知道我如何在一次测试中进行多个调用并检查相同的会话吗?提前感谢你的帮助

EN

回答 2

Stack Overflow用户

发布于 2017-08-24 04:04:29

您应该能够对两个调用使用相同的上下文。我已经在flask_restful上尝试过了,它很有效。您可以阅读应用程序上下文以及它们是如何传递的。此外,您可以尝试通过执行以下操作来使用current_app上下文:

代码语言:javascript
运行
AI代码解释
复制
from flask import current_app
current_app.app_context()

我会先试试这个:

代码语言:javascript
运行
AI代码解释
复制
from unittest import TestCase
from flask import Flask, session
from mypackage import auth_blueprint


class FlaskTestCase(TestCase):
    def setUp(self):
        self.app = Flask(__name__)
        self.app.secret_key = urandom(24)
        self.app.register_blueprint(auth_blueprint)   # The blueprint to test
        self.client = self.app.test_client()
        self.app.app_context().push()


    def test_login_logout():
        with self.app.app_context():
            self.client.post("/auth/login", data={"username": "foo", "password": "bar"})
            assert session["logged_in"]
            # How would I make A call to logout?
            self.client.post("/auth/logout")
            assert not session["logged_in"]
票数 2
EN

Stack Overflow用户

发布于 2019-10-14 10:45:34

您可以使用setUpClass和tearDownClass。您首先需要定义一个将在单独的测试文件中调用的全局TestCase。

我给出的例子是使用connexion。您可以通过更新setUpClass定义并仅将应用程序定义为Flask应用程序来调整它。

test_server.py

代码语言:javascript
运行
AI代码解释
复制
import unittest
import os
import connexion
import logbook

from config import db
from models import Book


# Logging configuration
log = logbook.Logger(__name__)

# Books Fixtures
BOOKS = [
    {
        'name': 'Book 1',
    },
    {
        'name': 'Book 2',
    },
    {
        'name': 'Book 3'
    },
]


class TestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        basedir = os.path.abspath(os.path.dirname(__file__))
        log.info("setUpClass")
        # Setting UP the DB and the tests
        cls.connex_app = connexion.App(__name__, specification_dir=basedir)
        cls.connex_app.add_api('swagger.yml', validate_responses=True)
        cls.connex_app.app.config['TESTING'] = True
        cls.connex_app.app.config['WTF_CSRF_ENABLED'] = False
        cls.connex_app.app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db')
        # Delete DB if exists : not for production
        if os.path.exists('test.db'):
            os.remove('test.db')
        db.create_all()
        TestCase.add_sample_algorithm()
        TestCase.add_sample_backtest()
        cls.test_client = cls.connex_app.app.test_client()

    @staticmethod
    def add_sample_book():
        # Iterate over the BOOKS Dictionary and populate the DB :
        for book in BOOKS:
            book_to_add = Book(name=book['name'])
            log.info("## Book to add:" + str(book_to_add))
            db.session.add(book_to_add)

        db.session.commit()

    @classmethod
    def tearDownClass(cls):
        log.info("tearDownClass ")
        db.session.remove()
        db.drop_all()
        if os.path.exists('test.db'):
            os.remove('test.db')


if __name__ == '__main__':
    unittest.main()

然后,您可以在每个测试文件中调用测试服务器,该服务器将创建一个测试数据库,运行一个测试客户端,然后在测试电池完成后将其拆除。以这种方式定义的setUpClass和tearDownClass将避免出现问题(从多个测试文件调用测试服务器时的蓝图)(例如attributeError:蓝图之间发生名称冲突)。

代码语言:javascript
运行
AI代码解释
复制
from test_server import TestCase


class BookTest(TestCase):
    @classmethod
    def setUpClass(cls):
        super(BookTest, cls).setUpClass()
        # Additional initialization

    @classmethod
    def tearDownClass(cls):
        super(BookTest, cls).tearDownClass()

    def test_get_root(self):
        resp = self.test_client.get('/')
        self.assertEqual(404, resp.status_code)

    def test_get_all_books(self):
        resp = self.test_client.get('/api/books')
        self.assertEqual(200, resp.status_code)
        self.assertEqual(3, len(resp.json))

        # Book 1 :
        self.assertEqual(resp.json[0]['name'], "Book 1")

谢谢,

阿尤布

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45821222

复制
相关文章
Flask(三)之请求上下文源码分析
run_simple是werkzeug内部的方法,在run_simple执行时会将app加括号调用从而执行app的__call__方法,来看__call__源码:
GH
2020/03/19
3710
Flask的请求钩子与上下文简记
Flask的请求钩子通过装饰器实现,每个钩子可以注册任意多个处理函数,默认的五种请求钩子如下:
Cloud-Cloudys
2020/07/07
7430
软件测试|测试平台开发-Flask 入门:Flask HTTP请求详解
上一篇文章我们介绍了flask的基本使用,编写了flask的第一个脚本。在本文中,我们将详细介绍如何使用Flask进行HTTP请求。我们将学习如何创建Flask应用程序,并通过不同的HTTP方法(GET、POST、PUT、DELETE等)发送请求。
霍格沃兹测试开发Muller老师
2023/10/19
3190
Flask 请求钩子
为了让每个视图函数避免编写重复功能的代码,Flask 提供了通用设施的功能,即请求钩子。
忆想不到的晖
2022/05/11
8530
Flask 请求钩子
Flask 中的上下文管理和请求钩子
在使用 Flask 框架实现功能接口的时候,前端点击按钮发送请求的请求方式和 form 表单提交给后端的数据,后端都是通过 Flask 中的 request 对象来获取的。
Python碎片公众号
2021/02/26
1.8K0
Flask 中的上下文管理和请求钩子
Flask 请求钩子
在Django中有中间件这个类来做一些视图执行前、执行中、执行后的一些额外业务处理,那么在Flask则是采用请求钩子的方式来处理。
Devops海洋的渔夫
2019/12/16
8870
Flask 请求钩子
【Flask】Flask路由与请求
可以分成两个文件,一个里面放主函数,为程序运行入口,还有flask对象注册,将蓝图注册到flask对象中,url_prefix参数可以理解为注册根目录,另一个文件中通过route装饰器来创建子目录响应。详情见获取请求对象和POST参数。
半生瓜的blog
2023/05/13
2100
【Flask】Flask路由与请求
Flask-在Flask中跨请求传递数据资源
利用 Flask的底层Werkzeug是有缓存支持的,不用使用redis等第三方。
用户1558882
2018/10/25
1.3K0
python问题解决,[WinError 10049] 在其上下文中,该请求的地址无效
分析问题: Traceback (most recent call last): File “***/test.py”, line 5, in skt.bind((’***’, 5555)) OSError: [WinError 10049] 在其上下文中,该请求的地址无效
全栈程序员站长
2022/11/15
4.6K0
python问题解决,[WinError 10049] 在其上下文中,该请求的地址无效
Flask框架中request、请求钩子、上下文用法分析
这篇文章主要介绍了Flask框架中request、请求钩子、上下文用法,结合实例形式分析了flask框架中request、请求钩子及上下文的功能、用法及相关操作注意事项,需要的朋友可以参考下
Python之道
2020/06/02
8290
flask之请求钩子
from flask import Flask from flask import abort app = Flask(__name__) # 在第一次请求之前调用,可以在此方法内部做一些初始化操作 @app.before_first_request def before_first_request(): print("before_first_request") # 在每一次请求之前调用,这时候已经有请求了,可能在这个方法里面做请求的校验 # 如果请求的校验不成功,可以直接在此方法中进行
汪凡
2019/03/01
4430
小白学Flask第八天| Flask上下文和请求钩子
在这篇文章之前,我们学习过request和session这两个小家伙,他们两的功能都非常的强大,我们今天讲上下文对象,也是和他们两有着很大的关系。
Python进击者
2019/09/17
6290
Flask request请求对象
request ,就是 Flask 中表示当前请求的对象,request 对象中保存了一次 http 请求的所有数据,并进行了封装处理,我们就可以用这个 request 请求对象来获取请求信息。
忆想不到的晖
2021/12/06
1.2K0
Flask request请求对象
Flask请求方法(三)
HTTTP的协议是基于应用层的协议,不需要刻意的去关注网络传输层的协议,它主要用于客户端与服务端之间的通信方式。在HTTP协议中,常用的请求方法主要是GET,POST,PUT,DELETE的请求方法。在HTTP协议中,客户端向服务端发送请求的时候,需要带上对应的请求方法,服务端接收到请求方法后,然后把响应内容返回给客户端。
无涯WuYa
2019/12/10
1K0
Flask请求方法(三)
Flask的请求扩展
from flask import Flask,request app = Flask(__name__) 一.请求前 before_request 用法 @app.before_request def func(): print(request) #可以在请求来前对于request进行处理 #return 如果有返回值页面将渲染返回值不走@app.routex相关函数 #如有有返回值且有after_request相关函数他的返回值会接着执行after_request相关函数
小小咸鱼YwY
2020/06/19
4890
Python Flask 编程 | 连载 03 - Flask 请求
应用上下文对象有两个,分别是 current_app 表示当前应用的实例以及 g 表示处理请求时临时存储对象,每次请求都会重设这个变量,并且 g 对象时线程隔离的,使用g对象需要导入,g 既 global。
RiemannHypothesis
2022/09/26
3680
Python Flask 编程 | 连载 03 - Flask 请求
【Flask】Flask响应请求与模板引擎
这里的layout就是一个通用的模板。extend_template.html和extend_template_other.html在layout.html基础上进行修改。(例如:子类重写父类)
半生瓜的blog
2023/05/13
2490
【Flask】Flask响应请求与模板引擎
flask cors跨域请求(flask 102)
当调用服务端的域名与服务端不一致(前后端分离)的时候会出现跨域问题,可使用Flask-Cors解决以上问题 安装Flask-Cors pip3 install Flask-Cors 使用 from flask_cors import CORS from flask import Flask
用户5760343
2019/08/20
5530
重放浏览器多个请求性能测试实践
前两天写了一篇文章重放浏览器单个请求性能测试实践,介绍了如何从浏览器中复制请求,来获取请求对象,进而完成单接口的性能测试工作。今天就来分享一下如何通过这种方式进行多接口性能测试。
FunTester
2021/02/24
4710
flask中请求勾子
在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:     *在请求开始时,建立数据库连接;     *在请求开始时,根据需求进行权限校验;     *在请求结束时,指定数据的交互格式;
py3study
2020/01/19
3890

相似问题

Flask:在请求上下文中插入新属性以进行测试

16

Keras load_model()仅在Flask请求上下文中失败

20

在Flask中处理多个请求

22

请求在上下文中丢失

31

Flask测试:测试应用程序请求?

29
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档