在行为步骤中访问Flask会话

时间:2018-01-29 09:56:42

标签: python session flask python-behave

我正在按照说明here使用Flask和{ "name": "ucps-online-client", "version": "1.0.0", "license": "MIT", "angular-cli": {}, "scripts": { "ng": "ng", "start": "ng serve --proxy-config proxy.conf.json", "lint": "ng lint" }, "dependencies": { "@angular/common": "4.4.6", "@angular/compiler": "4.4.6", "@angular/core": "4.4.6", "@angular/forms": "4.4.6", "@angular/http": "4.4.6", "@angular/platform-browser": "4.4.6", "@angular/platform-browser-dynamic": "4.4.6", "@angular/router": "4.4.6", "core-js": "2.5.1", "rxjs": "5.5.2", "zone.js": "0.8.18", "ts-helpers": "1.1.2", "bootstrap": "3.3.7", "ng2-bootstrap": "1.6.3", "jquery": "2.2.3", "primeng": "4.1.0", "ng2-datetime-picker": "0.12.9", "font-awesome": "4.6.3", "moment": "2.17.1", "ng2-datepicker": "1.8.3", "ng2-pagination": "2.0.2", "@angular/animations": "4.4.6" } , "devDependencies": { "@angular/compiler-cli": "4.4.6", "@types/node": "7.0.48", "@angular/cli": "1.5.3", "codelyzer": "2.1.1", "ts-node": "3.3.0", "tslint": "5.8.0", "typescript": "2.6.1" } , "engines": { "node": ">= 6.9.1", "npm": ">= 3" } }

我正在使用Flask测试客户端访问页面(而不是通过Selenium之类的浏览器访问)。例如,在测试客户端上调用behave以获得响应。

我想在我的步骤中访问Flask会话数据。 Testing Flask Applications页面上有关于访问上下文和会话的各种技术,但我看不出它们中的任何一个是我在使用行为时所需要的,特别是因为我将在一个页面中访问该页面步骤然后想要在另一个中检索会话。

我的get看起来像这样:

environment.py

1 个答案:

答案 0 :(得分:0)

最接近我需要的Flask测试技术是this one

from my_app import app


def before_scenario(context, scenario):
    app.testing = True
    # load the test config to ensure e.g. right database used
    app.config.from_object('parameters.test')
    context.client = app.test_client()


def after_scenario(context, scenario):
    pass

我遇到的问题是我需要在一个步骤中发出with app.test_client() as c: rv = c.get('/') assert flask.session['foo'] == 42 请求,然后在另一个步骤中检查会话 - 即代码在不同的函数中,所以不能全部包含在get阻止。

阅读课程

with statement对于类似于try / finally的模式来说基本上是语法糖(参见链接),所以我可以稍微分解一下,给我以下with

environment.py

在我的步骤中,我现在可以执行from my_app import app def before_scenario(context, scenario): # all the code I had before still here # ... # and this new line: context.client.__enter__() def after_scenario(context, scenario): # the exit code doesn't actually use its parameters, so providing None is fine context.client.__exit__(None, None, None) 并访问from flask import session,就像我在普通应用程序中一样。您可以以同样的方式访问session

撰写会议

正如Flask测试页面所说,这种方法“无法在发出请求之前修改会话或访问会话。”

如果您需要这样做,则需要进一步扩展模式。首先(在request中),将before_scenario的返回值分配给您稍后可以访问的变量:

__enter__()

然后,在您的步骤中,您可以执行此操作:

context.session = context.client.__enter__()

这是我在回答开头链接的部分中描述的第二种模式。唯一的修改是您需要存储with context.session.session_transaction() as sess: sess['key here'] = some_value 的返回值,因为您没有使用__enter__()语句。