gpt4 book ai didi

django - 在 Django 中,我如何告诉我的项目在运行时在不同的日志目录中读/写?

转载 作者:行者123 更新时间:2023-11-28 20:45:25 25 4
gpt4 key购买 nike

我正在开发一个 Django 项目,它有一个模型和关系数据库,写入项目目录外名为 activity_logs 的日志目录,以跟踪格式化的用户事件,每个用户一个文件。这是一种替代的基于文件结构的解决方案,可以让数据库表携带此信息,因为这会从数据库中卸载一些存储,并且相对容易格式化和表达此类事件。也许你们中的一些人可能会建议将此类数据存储在数据库中,这很好,但我仍然相信所有这些问题都需要我帮助回答。

这个 django 项目有多个应用程序,每个应用程序都有一个广泛的测试套件。此外,还有一个 logging.py 文件封装了日志记录功能(向/从日志文件写入/读取事件),因此测试套件中的测试用例以及 View 函数(和各种其他实用功能)都利用这些日志记录功能来存储这些用户事件并根据模型关系检索它们以模拟用户通知系统。由于日志记录模块负责此日志记录,它需要知道写入何处,因此我们有一个名为 activity_logs 的目录结构,它将用户日志文件写入其中,为新用户创建一个并为从数据库中删除的用户删除一个。我们想在此项目中进行的最新更改之一是创建一个单独的日志记录目录来测试此日志记录功能,类似于 test_activity_logs,这样在写入测试目录时就不会混淆用于测试用户或用于真实用户的常规事件日志目录。

我的问题是:在运行时,我如何告诉系统,无论是在哪个执行起点(无论是通过 django 测试 Client 对象的 View 函数调用,测试用例,通过 URL 等发出的实际 HTTP 请求),何时查看 activity_logstest_activity_logs 目录?这完全取决于我是为真实用户还是测试用户生成新信息,但用户是我们系统中的用户,我在尝试告诉这些调用某些日志记录函数的函数写入时遇到了一些麻烦测试日志目录与常规目录。例如,我正在尝试的一种方法是将关键字参数 (kwarg) 传递给日志记录函数,以便它们可以知道要读取/写入哪个目录,如下所示:

self.assertTrue(activity_has_been_logged(ACTIVITY_ACCOUNT_CREATED, user.get_profile(), use_test_activity_log_directory=True) == True)

名为 use_test_activity_log_directory=True 的 kwarg 将告诉名为 activity_has_been_logged 的日志记录函数读取测试事件日志目录。不幸的是,除了有点不灵活(但可以容忍)之外,这并没有解决 django 测试 client 对象通过 URL 将 GET 或 POST 请求发送到将事件写入的 View 函数的情况日志文件:

response = client.post(propose_match_url, post) #如果默认写入常规目录,则不能写入 test_log_directory!

我如何让客户端将这个 kwarg 传递给那些 View 函数?我认为完全可以做到这一点,但我不确定摆弄这些 kwargs 是否是最好的方法,或者在项目设置文件中创建一个全局变量,但也许这可能会导致竞争条件出现问题具有共享的可变变量。

你的帮助会很棒。提前致谢!

最佳答案

所以我刚刚解决了这个问题。承载所有日志功能的日志文件实际上是唯一需要知道在哪里查看的地方(test_activity_logsactivity_logs),因为所有其他组件都将调用日志中的函数向/从这些目录写入/读取的模块。我为 UserProfile 类的模型类提供了一个名为 is_test 的附加字段,这是一个 bool 字段,用于确定是否查看 test_activity_logs is_test=True,或 activity_logs 如果 is_test=False。这样,日志记录模块只需检查类型为 UserProfile 的输入参数及其新字段即可确定在何处执行其日志记录功能。问题解决了!

关于django - 在 Django 中,我如何告诉我的项目在运行时在不同的日志目录中读/写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com