为Camptocamp WSGI应用程序提供常用工具
项目描述
Camptocamp WSGI utilities
这是一个Python 3库(>=3.5),为Camptocamp WSGI应用程序提供常用工具
- 提供Prometheus度量
- 允许使用主/从PostgreSQL配置
- CEE/UDP日志的记录处理程序
- 一个可选视图,用于更改运行时的日志级别
- SQL性能分析器,用于调试数据库性能问题,默认禁用。警告,它将减慢一切。
- 获取应用程序和已安装包的版本信息的视图
- 实现健康检查服务的框架
- 错误处理程序,在出现错误时向客户端发送JSON消息
- cornice服务,用于设置CORS的替代品
还提供编写验收测试的工具
- 一个类,可以从pytest fixture中使用来控制组合
- 一个类,可以从pytest fixture中使用来测试REST API
作为一个如何在使用Docker镜像提供的应用程序中使用它的例子,你可以查看acceptance_tests/app中的测试应用程序。要了解如何测试此类应用程序,请查看acceptance_tests/tests。
安装
自定义Docker镜像(来自PYPI库)
在这里,我们没有进行c2cwsgiutils的最小安装,而是放置了在集成和生产环境中监视应用程序所需的一切。
此库可在PYPI中找到:https://pypi.python.org/pypi/c2cwsgiutils
将模板配置文件复制并修改到您的项目中
- production.ini;
- gunicorn.conf.py。然后替换
c2cwsgiutils_app为您的包名。
您应该使用您用于管理pip依赖项的工具安装c2cwsgiutils。
在Dockerfile中,您应添加以下行
# Generate the version file.
RUN c2cwsgiutils-genversion $(git rev-parse HEAD)
CMD ["gunicorn", "--paste=/app/production.ini"]
# Default values for the environment variables
ENV \
DEVELOPMENT=0 \
SQLALCHEMY_POOL_RECYCLE=30 \
SQLALCHEMY_POOL_SIZE=5 \
SQLALCHEMY_MAX_OVERFLOW=25 \
SQLALCHEMY_SLAVE_POOL_RECYCLE=30 \
SQLALCHEMY_SLAVE_POOL_SIZE=5 \
SQLALCHEMY_SLAVE_MAX_OVERFLOW=25\
LOG_TYPE=console \
OTHER_LOG_LEVEL=WARNING \
GUNICORN_LOG_LEVEL=WARNING \
SQL_LOG_LEVEL=WARNING \
C2CWSGIUTILS_LOG_LEVEL=WARNING \
LOG_LEVEL=INFO
添加到您的main函数中。
config.include("c2cwsgiutils.pyramid")
dbsession = c2cwsgiutils.db.init(config, "sqlalchemy", "sqlalchemy_slave")
config.scan(...)
# Initialize the health checks
health_check = c2cwsgiutils.health_check.HealthCheck(config)
health_check.add_db_session_check(dbsession)
health_check.add_alembic_check(dbsession, "/app/alembic.ini", 1)
相关环境变量
DEVELOPMENT:设置为1以启用开发模式,默认为0。SQLALCHEMY_URL:SQLAlchemy URL,如postgresql://user:password@host:port/dbname。SQLALCHEMY_POOL_RECYCLE:SQLAlchemy池回收,默认为30。SQLALCHEMY_POOL_SIZE:SQLAlchemy池大小,默认为5。SQLALCHEMY_MAX_OVERFLOW:SQLAlchemy最大溢出,默认为25。SQLALCHEMY_SLAVE_URL:SQLAlchemy从属(只读)URL,如postgresql://user:password@host:port/dbname。SQLALCHEMY_SLAVE_POOL_RECYCLE:SQLAlchemy从属池回收,默认为30。SQLALCHEMY_SLAVE_POOL_SIZE:SQLAlchemy从属池大小,默认为5。SQLALCHEMY_SLAVE_MAX_OVERFLOW:SQLAlchemy从属最大溢出,默认为25。GUNICORN_WORKERS:工作进程的数量,默认为2。GUNICORN_THREADS:每个工作进程的线程数,默认为10。LOG_TYPE:日志类型,默认为console,在kubernetes上应使用json以与elk协同工作。LOG_LEVEL:应用程序日志级别,默认为INFO。SQL_LOG_LEVEL:SQL查询日志级别,WARNING:不记录日志,INFO:记录查询,DEBUG也记录结果,默认为WARNING。GUNICORN_ERROR_LOG_LEVEL:Gunicorn错误日志级别,默认为WARNING。C2CWSGIUTILS_CONFIG:gunicorn使用的备用ini文件,默认为production.ini。C2CWSGIUTILS_LOG_LEVEL:c2c WSGI工具日志级别,默认为WARNING。OTHER_LOG_LEVEL:所有其他日志记录器的日志级别,默认为WARNING。
这些环境变量可用于调查生产环境。
Docker(已弃用)
或(已弃用)作为基础Docker镜像:camptocamp/c2cwsgiutils:release_5或ghcr.io/camptocamp/c2cwsgiutils:release_5
如果您需要一个具有更小足迹的镜像,请使用以-light开头标记。这些镜像没有GDAL和构建工具。
我们废弃Docker镜像的原因是:
- 项目希望选择基础镜像。
- 项目锁定依赖的不同版本。
通用配置
通常,配置可以通过环境变量(首先使用)或通过production.ini文件中的条目来完成。
您可以使用名为C2C_BASE_PATH的环境变量或在production.ini文件中名为c2c.base_path的属性来配置访问由c2cwsgiutils提供的视图的基础URL。
添加了一些REST API,可以通过此URL查看:{C2C_BASE_PATH}。
一些API由一个秘密保护。这个秘密在C2C_SECRET变量或c2c.secret属性中指定。它可以作为secret查询参数或X-API-Key头传递。一旦使用正确的秘密访问,就会存储一个cookie,可以省略秘密。
使用C2C_SECRET的替代方案是使用GitHub上的身份验证,创建GitHub应用程序。
使用环境变量C2C_JSON_PRETTY_PRINT和C2C_JSON_SORT_KEYS或属性c2c.json.pretty_print和c2c.json.sort_keys配置json渲染器。默认为false。
然后,如果尚未认证(使用C2C_AUTH_GITHUB_CLIENT_ID、C2C_AUTH_GITHUB_CLIENT_SECRET和C2C_AUTH_GITHUB_SCOPE),它将重定向用户到GitHub身份验证表单。
然后,我们将检查用户是否有权访问应用程序,为此我们将检查用户是否有足够的GitHub仓库权限(使用C2C_AUTH_GITHUB_REPOSITORY和C2C_AUTH_GITHUB_REPOSITORY_ACCESS_TYPE)。
最后,我们将会在加密cookie中存储会话信息(使用C2C_AUTH_SECRET和C2C_AUTH_COOKIE)。
配置细节
使用环境变量C2C_AUTH_GITHUB_REPOSITORY或配置键c2c.auth.github.repository来定义相关的GitHub仓库(必需)。
使用环境变量C2C_AUTH_GITHUB_ACCESS_TYPE或配置键c2c.auth.github.access_type来定义所需的访问类型可以是pull、push或admin(默认是push)
使用环境变量C2C_AUTH_GITHUB_CLIENT_ID或配置键c2c.auth.github.client_id来定义GitHub应用程序ID(必需)
使用环境变量C2C_AUTH_GITHUB_CLIENT_SECRET或配置键c2c.auth.github.client_secret来定义GitHub应用程序秘密(必需)
使用环境变量C2C_AUTH_GITHUB_SCOPE或配置键c2c.auth.github.scope来定义GitHub作用域(默认是repo),请参阅GitHub文档
使用环境变量C2C_AUTH_GITHUB_SECRET或配置键c2c.auth.github.auth.secret来定义用于JWD加密的使用的秘密(必需,长度至少为16)
使用环境变量C2C_AUTH_GITHUB_COOKIE或配置键c2c.auth.github.auth.cookie来定义使用的cookie名称(默认为c2c-auth-jwt)
使用环境变量C2C_AUTH_GITHUB_AUTH_URL或配置键c2c.auth.github.auth_url来定义GitHub身份验证URL(默认为https://github.com/login/oauth/authorize)
使用环境变量C2C_AUTH_GITHUB_TOKEN_URL或配置键c2c.auth.github.token_url来定义GitHub身份验证URL(默认为https://github.com/login/oauth/access_token)
使用环境变量C2C_AUTH_GITHUB_USER_URL或配置键c2c.auth.github.user_url来定义GitHub身份验证URL(默认为https://api.github.com/user)
使用环境变量C2C_AUTH_GITHUB_REPO_URL或配置键c2c.auth.github.repo_url来定义GitHub身份验证URL(默认为https://api.github.com/repo)
使用环境变量 C2C_AUTH_GITHUB_PROXY_URL 或配置键 c2c.auth.github.auth.proxy_url 来定义 GitHub 和我们的应用程序之间的重定向代理,以便在 GitHub 上共享 OAuth2 应用程序(默认不使用代理)。适用于 此代理。
使用环境变量 C2C_USE_SESSION 或配置键 c2c.use_session 来定义是否使用会话。目前,我们可以在 OAuth2 登录期间使用会话来存储状态,用于防止 CSRF(默认为 false)
Pyramid
所有环境变量都可以在配置文件中使用类似 %(ENV_NAME)s 的方式使用。
要启用 c2cwsgiutils 的大多数功能,您需要将此行添加到您的 WSGI 主配置中
import c2cwsgiutils.pyramid
config.include(c2cwsgiutils.pyramid.includeme)
将错误捕获视图放入位置,以便以 JSON 格式返回错误。
提供了一个自定义加载器,用于在包含环境变量的配置文件上运行 pyramid 脚本。
proutes c2c://production.ini # relative path
proutes c2c:///app/production.ini # absolute path
自动安装了一个过滤器来处理常见代理设置的 HTTP 头部,并在请求对象中具有正确的值(例如 request.client_addr)。此过滤器相当于 PasteDeploy#prefix(减去前缀部分),但还支持较新的头部(如 Forwarded)。如果您需要为路由添加前缀,可以使用 Configurator 构造函数的 route_prefix 参数。
日志记录
提供了两个新的日志后端
c2cwsgiutils.pyramid_logging.PyramidCeeSysLogHandler:通过 UDP 将 @cee 格式的日志发送到 syslog。c2cwsgiutils.pyramid_logging.JsonLogHandler:将(在 stdout 或 stderr 上)输出 JSON 格式的日志。
请查看 acceptance_tests/app/production.ini 中的日志配置部分,以了解 paste 和命令行。
日志配置由 gunicorn 自动导入,可以通过设置环境变量 DEBUG_LOGCONFIG=1 来可视化字典配置。
您可以使用环境变量 C2C_LOG_VIEW_ENABLED 启用一个视图来配置实时系统上的日志级别。然后,可以通过对 {C2C_BASE_PATH}/logging/level?secret={C2C_SECRET}&name={logger_name} 的 GET 请求查询当前日志记录器的状态,并使用 {C2C_BASE_PATH}/logging/level?secret={C2C_SECRET}&name={logger_name}&level={level} 进行更改。如果配置了 C2C_REDIS_URL(c2c.redis_url)或 C2C_REDIS_SENTINELS,则覆盖将存储在 Redis 中。
数据库维护
您可以使用环境变量 C2C_DB_MAINTENANCE_VIEW_ENABLED 启用一个视图来强制使用从引擎。然后,可以使用 {C2C_BASE_PATH}/db/maintenance?secret={C2C_SECRET}&readonly=true 将数据库设置为“只读”。如果配置了 C2C_REDIS_URL(c2c.redis_url)或 C2C_REDIS_SENTINELS,则当前状态将存储在 Redis 中。
请求跟踪
为了跟踪所有服务(考虑为单独的进程)生成的请求日志,c2cwsgiutils 试图标记每一项请求 ID。此字段可以来自输入请求头部(如 X-Request-ID、X-Correlation-ID、Request-ID 或 X-Varnish)或默认为 UUID。您可以通过定义环境变量 C2C_REQUEST_ID_HEADER(c2c.request_id_header)来添加额外的请求头部作为来源。
在 JSON 记录格式中,自动添加 request_id 字段。
您可以通过设置环境变量 C2C_SQL_REQUEST_ID(或在 .ini 文件中 c2c.sql_request_id)来启用(默认禁用,因为它可能有一定的成本)SQL 请求的标记。这将使用应用程序名称来传递请求 ID。如果您这样做,则必须通过设置 log_line_prefix 为类似 "%a "(别忘了空格)的方式来在 PostgreSQL 日志中包含应用程序名称。
然后,在您的应用程序中,建议将请求ID传递给外部REST API。例如,使用X-Request-ID HTTP头。请求ID的值可以通过添加到Pyramid请求对象的c2c_request_id属性来访问。已修补requests模块以自动添加此头。
此外,requests模块也被修补以监控没有超时的请求。在这种情况下,您可以使用C2C_REQUESTS_DEFAULT_TIMEOUT环境变量(c2c.requests_default_timeout)配置默认超时。如果没有指定超时和默认值,则发出警告。
SQL分析器
必须使用C2C_SQL_PROFILER_ENABLED环境变量配置SQL分析器。这启用了一个视图来查询分析器的状态({C2C_BASE_PATH}/sql_profiler?secret={C2C_SECRET})或启用/禁用它({C2C_BASE_PATH}/sql_profiler?secret={C2C_SECRET}&enable={1|0})。
如果启用,对于每个由SQLAlchemy发送的SELECT查询,都会执行另一个带有EXPLAIN ANALYZE前缀的查询。结果被发送到c2cwsgiutils.sql_profiler记录器。
不要在繁忙的生产系统上启用它。它会杀死您的性能。
分析器
C2cwsgiutils提供了一种轻松分析应用程序的方法
使用装饰器
from c2cwsgiutils.profile import Profiler
@Profile('/my_file.prof')
my_function():
...
或使用with语句
from c2cwsgiutils.profile import Profiler
with Profile('/my_file.prof'):
...
然后使用SnakeViz打开您的文件
docker cp container_name:/my_file.prof .
pip install --user snakeviz
snakeviz my_file.prof
数据库会话
c2cwsgiutils.db.init允许您设置一个数据库会话,该会话有两个引擎用于访问主/从PostgreSQL配置。从引擎(只读)将自动用于GET和OPTIONS请求,而主引擎(读写)将用于其他查询。
要使用它,您的production.ini必须如下所示
sqlalchemy.url = %(SQLALCHEMY_URL)s
sqlalchemy.pool_recycle = %(SQLALCHEMY_POOL_RECYCLE)s
sqlalchemy.pool_size = %(SQLALCHEMY_POOL_SIZE)s
sqlalchemy.max_overflow = %(SQLALCHEMY_MAX_OVERFLOW)s
sqlalchemy_slave.url = %(SQLALCHEMY_SLAVE_URL)s
sqlalchemy_slave.pool_recycle = %(SQLALCHEMY_SLAVE_POOL_RECYCLE)s
sqlalchemy_slave.pool_size = %(SQLALCHEMY_SLAVE_POOL_SIZE)s
sqlalchemy_slave.max_overflow = %(SQLALCHEMY_SLAVE_MAX_OVERFLOW)s
并且初始化数据库连接的代码如下所示
import c2cwsgiutils.db
def main(config):
c2cwsgiutils.db.init(config, 'sqlalchemy', 'sqlalchemy_slave', force_slave=[
"POST /api/hello"
])[0]
您可以使用force_slave和force_master参数覆盖默认值并强制路由使用主引擎或从引擎。
健康检查
要启用健康检查,必须在您的WSGI主中添加一些设置(通常在数据库连接设置之后)。例如
from c2cwsgiutils.health_check import HealthCheck
def custom_check(request):
global not_happy
if not_happy:
raise Exception("I'm not happy")
return "happy"
health_check = HealthCheck(config)
health_check.add_db_session_check(models.DBSession, at_least_one_model=models.Hello)
health_check.add_url_check('https://:8080/api/hello')
health_check.add_custom_check('custom', custom_check, 2)
health_check.add_alembic_check(models.DBSession, '/app/alembic.ini', 3)
然后,可以使用URL {C2C_BASE_PATH}/health_check?max_level=3来运行健康检查并获得类似以下报告(在发生错误的情况下)
{
"status": 500,
"successes": {
"db_engine_sqlalchemy": { "timing": 0.002 },
"db_engine_sqlalchemy_slave": { "timing": 0.003 },
"https:///api/hello": { "timing": 0.01 },
"alembic_app_alembic.ini_alembic": { "timing": 0.005, "result": "4a8c1bb4e775" }
},
"failures": {
"custom": {
"message": "I'm not happy",
"timing": 0.001
}
}
}
级别如下
- 0:在此级别不添加检查。此max_level用于执行简单的ping。
- 1:检查对服务有用性的任何关键事项(数据库、redis、...)。这是默认的max_level,并被负载均衡器用于确定服务是否存活。
- >=2:根据您的方便使用这些级别。Pingdom和CO通常设置为max_level=100。所以请保持在下面。
可以使用URL {C2C_BASE_PATH}/health_check?checks=<check_name>来运行某些检查的健康检查,以逗号分隔的列表。
在实例化HealthCheck类时,可能自动启用两个检查
- 如果配置了redis,检查redis是否可访问。
- 如果配置了redis且版本信息可用,则检查所有实例之间的版本是否匹配。
有关更多信息,请参阅c2cwsgiutils.health_check.HealthCheck类的文档。
SQLAlchemy模型图
提供了一个命令,可以生成SQLAlchemy ORM模型的Doxygen图。请参阅acceptance_tests/app/models_graph.py了解其用法。
版本信息
如果存在/app/versions.json,则添加了一个视图({C2C_BASE_PATH}/versions.json)来查询应用程序的当前版本。该文件通过调用命令行c2cwsgiutils-genversion [$GIT_TAG] $GIT_HASH生成。通常在WSGI应用程序的Dockerfile中执行。
Prometheus
在c2cwsgiutils中集成了Prometheus客户端。
它将以多进程模式运行,具体限制请参见prometheus_client文档。
要启用它,您应提供C2C_PROMETHEUS_PORT环境变量。出于安全考虑,此端口号不应暴露。
我们可以使用以下环境变量进行自定义:
C2C_PROMETHEUS_PREFIX:用于自定义前缀,默认为c2cwsggiutils-。C2C_PROMETHEUS_PACKAGES:将在版本信息中出现的包,默认为c2cwsgiutils,pyramid,gunicorn,sqlalchemy。C2C_PROMETHEUS_APPLICATION_PACKAGE:将在版本信息中作为应用出现的包。
您应在gunicorn.conf.py中添加以下内容:
from prometheus_client import multiprocess
def on_starting(server):
from c2cwsgiutils import prometheus
del server
prometheus.start()
def post_fork(server, worker):
from c2cwsgiutils import prometheus
del server, worker
prometheus.cleanup()
def child_exit(server, worker):
del server
multiprocess.mark_process_dead(worker.pid)
在您的Dockerfile中,您应添加:
RUN mkdir -p /prometheus-metrics \
&& chmod a+rwx /prometheus-metrics
ENV PROMETHEUS_MULTIPROC_DIR=/prometheus-metrics
添加自定义度量收集器
请参阅官方文档。
与Unix进程相关。
from c2cwsgiutils import broadcast, prometheus
prometheus.MULTI_PROCESS_COLLECTOR_BROADCAST_CHANNELS.append("prometheus_collector_custom")
broadcast.subscribe("c2cwsgiutils_prometheus_collect_gc", _broadcast_collector_custom)
my_custom_collector_instance = MyCustomCollector()
def _broadcast_collector_custom() -> List[prometheus.SerializedGauge]:
"""Get the collected GC gauges."""
return prometheus.serialize_collected_data(my_custom_collector_instance)
与主机相关,请在gunicorn.conf.py中使用该信息。
def on_starting(server):
from c2cwsgiutils import prometheus
del server
registry = CollectorRegistry()
registry.register(MyCollector())
prometheus.start(registry)
数据库度量
如果您想生成关于行计数的统计数据(度量),请查看c2cwsgiutils-stats-db实用程序。
度量使用
由于c2cwsgiutils的每个实例(Pod)都有自己的度量,因此我们需要将它们聚合起来,以便得到您可能需要的服务的度量,您可以使用sum by (<fields>) (<metric>)来获取度量(特别是计数器)。
自定义脚本
要使用脚本初始化应用程序,您应使用c2cwsgiutils.setup_process.bootstrap_application_from_options函数。
main函数的示例
def main() -> None:
parser = argparse.ArgumentParser(description="My scrypt.")
# Add your argument here
c2cwsgiutils.setup_process.fill_arguments(parser)
args = parser.parse_args()
env = c2cwsgiutils.setup_process.bootstrap_application_from_options(args)
settings = env["registry"].settings
# Add your code here
如果您需要访问数据库,您应添加:
engine = c2cwsgiutils.db.get_engine(settings)
session_factory = c2cwsgiutils.db.get_session_factory(engine)
with transaction.manager:
# Add your code here
如果您需要不带应用程序上下文的数据库连接,您可以替换为:
env = c2cwsgiutils.setup_process.bootstrap_application_from_options(args)
settings = env["registry"].settings
由
loader = pyramid.scripts.common.get_config_loader(args.config_uri)
loader.setup_logging(parse_vars(args.config_vars) if args.config_vars else None)
settings = loader.get_settings()
调试
要启用调试界面,您必须设置C2C_DEBUG_VIEW_ENABLED环境变量。然后您可以看到一些事物的转储
- 每个线程的堆栈跟踪:
{C2C_BASE_PATH}/debug/stacks?secret={C2C_SECRET} - 内存使用:
{C2C_BASE_PATH}/debug/memory?secret={C2C_SECRET}&limit=30&analyze_type=builtins.dict&python_internals_map=false - 对象引用:
{C2C_BASE_PATH}/debug/show_refs.dot?secret={C2C_SECRET}&analyze_type=gunicorn.app.wsgiapp.WSGIApplication&analyze_id=12345&max_depth=3&too_many=10&filter=1024&no_extra_info&backrefsanalyze_type和analyze_id不应同时使用,您可以使用它如下curl "<URL>" > /tmp/show_refs.dot dot -Lg -Tpng /tmp/show_refs.dot > /tmp/show_refs.png
- 调用另一个API时的内存增加:
{C2C_BASE_PATH}/debug/memory_diff?path={path_info}&secret={C2C_SECRET}&limit=30&no_warmup - 暂停给定数量的秒数(用于测试负载均衡器超时):
{C2C_BASE_PATH}/debug/sleep?secret={C2C_SECRET}&time=60.2 - 查看WSGI接收到的HTTP头:
{C2C_BASE_PATH}/debug/headers?secret={C2C_SECRET}&status=500 - 返回HTTP错误:
{C2C_BASE_PATH}/debug/error?secret={C2C_SECRET}&status=500
为了便于本地开发,当文件更改时,视图会自动重新加载。此外,文件系统由docker-compose.override.yaml文件挂载。请确保不要在生产环境中使用此类文件/机制。
广播
一些c2cwsgiutils API会影响或查询WSGI服务器的状态。由于默认情况下,每5个进程中的一个会进行查询,因此只有这一个会受到影响的。为了避免这种情况,您可以配置c2cwsgiutils使用Redis pub/sub来广播这些请求并收集答案。
受影响的API有:
{C2C_BASE_PATH}/debug/stacks{C2C_BASE_PATH}/debug/memory{C2C_BASE_PATH}/logging/level{C2C_BASE_PATH}/sql_profiler
配置参数是:
C2C_REDIS_URL(c2c.redis_url):要使用的Redis单实例的URLC2C_REDIS_OPTIONS:Redis选项,以逗号分隔的等号列表,值作为YAML解析C2C_REDIS_SENTINELS:要使用的逗号分隔的Redis主机:端口哨兵实例列表C2C_REDIS_SERVICENAME:在使用哨兵的情况下使用的redis服务名称C2C_REDIS_DB:在使用哨兵的情况下使用的redis数据库编号C2C_BROADCAST_PREFIX(c2c.broadcast_prefix):要添加到正在使用的通道的前缀(对于2个不同的服务必须不同)
如果没有配置,只有接收请求的进程受到影响。
CORS
为了具有CORS兼容的视图,请像这样定义您的视图
from c2cwsgiutils import services
hello_service = services.create("hello", "/hello", cors_credentials=True)
@hello_service.get()
def hello_get(request):
return {'hello': True}
异常处理
c2cwsgiutils可以安装异常处理视图,这些视图将捕获应用程序视图抛出的任何异常,并将其转换为包含相应错误HTTP状态的JSON响应。
您可以通过将C2C_ENABLE_EXCEPTION_HANDLING (c2c.enable_exception_handling)设置为"1"来启用此功能。
在开发模式(DEVELOPMENT=1)下,所有详细信息(SQL语句、堆栈跟踪等)都将发送到客户端。在生产模式下,您可以通过发送在查询中定义的C2C_SECRET中的秘密来获取它们。
如果您想使用pyramid_debugtoolbar,则需要禁用异常处理并按如下方式配置
pyramid.includes =
pyramid_debugtoolbar
debugtoolbar.enabled = true
debugtoolbar.hosts = 0.0.0.0/0
debugtoolbar.intercept_exc = debug
debugtoolbar.show_on_exc_only = true
c2c.enable_exception_handling = 0
JSON美化打印
一些JSON渲染器可用
json:正常的JSON渲染器(默认)。fast_json:使用ujson的更快JSON渲染器。cornice_json:围绕cornice CorniceRenderer的普通JSON渲染器。cornice_fast_json:围绕cornice CorniceRenderer的更快JSON渲染器。
两者都美化了渲染的JSON。虽然这会增加大量的空白,但由于gzip压缩,网络传输的字节数差异可以忽略不计。
fast_json渲染器使用ujson,这更快,但无法更改某些类型的渲染(json.dumps的default参数)。这将与papyrus等产生不良交互。
应使用cornice版本以避免"‘JSON’对象没有属性'render_errors'"错误。
Sentry集成
堆栈跟踪可以发送到sentry.io服务进行收集。要启用它,您必须将SENTRY_URL (c2c.sentry_url)设置为指向项目的公共DSN。
可以使用一些其他环境变量来调整每个报告发送的信息
SENTRY_EXCLUDES(c2c.sentry.excludes):要排除的记录器列表(冒号分隔,不带空格)GIT_HASH(c2c.git_hash):将用于版本SENTRY_CLIENT_RELEASE:如果不等于"latest",将代替GIT_HASH用于版本SENTRY_CLIENT_ENVIRONMENT:环境(dev、int、prod等)SENTRY_CLIENT_IGNORE_EXCEPTIONS:要忽略的异常列表(逗号分隔,默认为SystemExit)SENTRY_TAG_...:添加其他自定义标签SENTRY_LEVEL:从哪个日志级别开始将事件发送到Sentry(默认为ERROR)SENTRY_TRACES_SAMPLE_RATE:为了计算性能,发送到Sentry的事件百分比。值在0到1之间,默认为0。
开发者信息
您需要在机器上安装docker(>=1.12.0)、docker-compose(>=1.10.0)和make才能与该项目互动。使用apt-get policy docker-engine检查docker-engine的可用版本,并最终使用类似于apt-get install docker-engine=1.12.3-0~xenial的命令强制安装最新版本。
要检查和测试一切,请运行以下命令
make
确保您对版本号很严格
- 错误修复版本更改:API中没有添加、删除或更改任何内容,只是依赖项的错误修复版本号更改
- 次要版本更改:API必须保持向后兼容,并且依赖项只有次要版本号更改
- 主版本变更:API 和依赖项不向后兼容
发布版本
- 在 setup.py 中更改版本。
- 提交并推送到 master 分支。
- 标记 Git 提交。
- 在
.github/workflows/rebuild.yaml和.github/workflows/audit.yaml文件中添加新的分支名称。
测试
屏幕截图
要测试屏幕截图,您需要使用 npm 安装 node,为此,请将以下行添加到您的 Dockerfile 中
RUN --mount=type=cache,target=/var/lib/apt/lists \
--mount=type=cache,target=/var/cache,sharing=locked \
apt-get install --yes --no-install-recommends gnupg \
&& . /etc/os-release \
&& echo "deb https://deb.nodesource.com/node_18.x ${VERSION_CODENAME} main" > /etc/apt/sources.list.d/nodesource.list \
&& curl --silent https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - \
&& apt-get update \
&& apt-get install --assume-yes --no-install-recommends 'nodejs=18.*' \
libx11-6 libx11-xcb1 libxcomposite1 libxcursor1 \
libxdamage1 libxext6 libxi6 libxtst6 libnss3 libcups2 libxss1 libxrandr2 libasound2 libatk1.0-0 \
libatk-bridge2.0-0 libpangocairo-1.0-0 libgtk-3.0 libxcb-dri3-0 libgbm1 libxshmfence1
要进行图像测试,请调用 check_screenshot,例如
from c2cwsgiutils.acceptance import image
def test_screenshot(app_connection):
image.check_screenshot(
app_connection.base_url + "my-path",
width=800,
height=600,
result_folder="results",
expected_filename=os.path.join(os.path.dirname(__file__), "my-check.expected.png"),
)
贡献
安装预提交钩子
pip install pre-commit
pre-commit install --allow-missing-config
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。
源代码分发
构建分发
c2cwsgiutils-6.0.8.tar.gz的散列值
| 算法 | 散列摘要 | |
|---|---|---|
| SHA256 | b416a20a8490e30deed307811fba1b93d662c5d849fc36b0f94927f0440f2048 |
|
| MD5 | 137f11acbb44b1791472a8de278b74bc |
|
| BLAKE2b-256 | cbf3d0d1443b435bd2fd1bc82f33438bbcb979c630283e4a783a5745c66f4d06 |