首页 > 其他分享 >Flask作为企业级项目的服务端项目在测试骨架蓝图的伪造资源和环境以及出错处理的方法记录

Flask作为企业级项目的服务端项目在测试骨架蓝图的伪造资源和环境以及出错处理的方法记录

时间:2022-10-24 17:35:17浏览次数:119  
标签:Flask app 应用程序 企业级 flaskr user import 服务端

测试骨架

首先,我们将测试文件夹添加到应用程序的根文件夹中。然后创建一个Python文件来存储测试内容(test_flaskr.py)。名称与test_*类似。pytest将自动找到py文件。 接下来,我们创建一个名为client()的pytest固件来配置调试应用程序并初始化一个新数据库:

import os
import tempfile

import pytest

from flaskr import flaskr


@pytest.fixture
def client():
    db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp()
    flaskr.app.config['TESTING'] = True

    with flaskr.app.test_client() as client:
        with flaskr.app.app_context():
            flaskr.init_db()
        yield client

    os.close(db_fd)
    os.unlink(flaskr.app.config['DATABASE'])

客户端固件将由每个独立测试调用。它为我们提供了一个简单的应用程序接口,用于向应用程序发送请求和跟踪cookie。 在配置中,TESTING配置标志被激活。通过这种方式,在请求处理期间关闭错误捕获,以便于在测试期间更好地报告错误。 因为SQLite3基于文件系统,所以我们可以轻松地使用tempfile模块创建临时数据库并对其进行初始化。mkstemp()函数返回两个东西:一个低级文件句柄和一个随机文件名。此文件名后面将是我们的数据库名。我们必须将句柄保存到db_Fd以使用os关闭文件。close()函数。 为了在测试后删除数据库,固件关闭并删除文件。

伪造资源和环境

通常,我们会将用户身份验证信息和数据库连接存储到应用程序环境或烧瓶G对象,并在首次使用之前准备好,然后在断开连接时删除。假设在应用程序中获得的当前用户的代码如下:

def get_user():
    user = getattr(g, 'user', None)
    if user is None:
        user = fetch_current_user_from_database()
        g.user = user
    return user

测试 CLI 命令

单击来自测试工具,可用于测试CLI命令。CliRunner独立运行命令,并通过Result对象捕获输出。 Flask提供test_cli_Runner()来创建FlaskCliRunner,以自动将Flask应用程序传输到cli。使用其invoke()方法调用命令,就像在命令行上调用它一样:

import click

@app.cli.command('hello')
@click.option('--name', default='World')
def hello_command(name)
    click.echo(f'Hello, {name}!')

def test_hello():
    runner = app.test_cli_runner()

    # invoke the command directly
    result = runner.invoke(hello_command, ['--name', 'Flask'])
    assert 'Hello, Flask' in result.output

    # or by name
    result = runner.invoke(args=['hello'])
    assert 'World' in result.output

线程本地对象

Flask使用线程本地对象(实际上是上下文本地对象,它也支持greenlet上下文)来支持请求、会话和一个可以放置自己东西的附加对象(g)。你为什么这么做?这不是个坏主意吗? 是的,使用线程本地对象通常不是明智的选择,这会在不基于线程概念的服务器上造成问题,并增加大型应用程序的维护难度。然而,Flask不仅是为大型应用程序或异步服务器设计的,而且还希望简化和加速传统web应用程序的开发。

蓝图

与验证蓝图不同,博客蓝图没有url_前缀因此,索引视图将用于/,create将用于/create,依此类推。博客是Flaskr的主要功能,因此将博客索引作为主要索引是合理的。

from flask import (
    Blueprint, flash, g, redirect, render_template, request, url_for
)
from werkzeug.exceptions import abort

from flaskr.auth import login_required
from flaskr.db import get_db

bp = Blueprint('blog', __name__)

但是,下面的索引视图的端点将被定义为博客索引一些验证视图被分配给普通索引端点。我们使用app add_url_规则()与端点名称“index”和/url相关联,因此url_For('index')或url_For('blog.index'”)将有效,并且将生成相同的/url。 在其他应用程序中,可以在factory_Prefix中为博客蓝图提供URL,并定义一个 独立的索引视图,类似于上一篇文章中的hello视图。在这种情况下,index和blog索引的端点和URL将不同。

把出错信息通过电子邮件发送给管理者

要主动查找和修复错误,可以配置日志记录。handlers SMTPHandler用于在发生一般错误或更高级别错误时发送电子邮件:

import logging
from logging.handlers import SMTPHandler

mail_handler = SMTPHandler(
    mailhost='127.0.0.1',
    fromaddr='[email protected]',
    toaddrs=['[email protected]'],
    subject='Application Error'
)
mail_handler.setLevel(logging.ERROR)
mail_handler.setFormatter(logging.Formatter(
    '[%(asctime)s] %(levelname)s in %(module)s: %(message)s'
))

if not app.debug:
    app.logger.addHandler(mail_handler)

当产品在远程服务器上运行时,可能不会频繁查看日志信息。WSGI服务器可能会在一个文件中记录日志消息,只有当用户告诉您错误时,您才会查看日志文件。

标签:Flask,app,应用程序,企业级,flaskr,user,import,服务端
From: https://blog.51cto.com/u_15568258/5787715

相关文章