Django rest_framework.views 如何跳过数据库连接以简化 REST API

2 投票
1 回答
1426 浏览
提问于 2025-04-19 10:05

有没有办法禁用 Django Rest Framework 的默认行为,让它不去查找后端数据库?在我的项目中,有几个简单的 API 不需要数据库。但在后台,Django 还是试图连接数据库,这样就增加了响应时间。

需要注意的是,我在设置中有 CONN_MAX_AGE,所以在最好的情况下,我不会看到 MySQLdb:Connect 的痕迹,但由于它的默认行为,还是会执行其他 SQL 操作。

我希望有人遇到过这个问题并知道解决办法。为了更深入了解,我还贴出了我简单 API 的 New Relic 报告的跟踪信息。

from rest_framework.views import View
class ServerStatusTestView(View):
    def get(self, request):
        return HttpResponse('Some Response')
  • MySQLdb:Connect ==> 65 ms
  • WSGI/Response ==> 21.1ms
  • 其他 - SQL ==> 11.3ms
  • django.core.urlresolvers:RegexURLResolver.resolve ==> .8ms
  • django.http.response:HttpResponse.close ==> .5ms
  • django.middleware.csrf:CsrfViewMiddleware.process_view ==>.5ms
  • ServerStatusTestView ===> .2ms
  • django.middleware.common:CommonMiddleware.process_request ==> .1

编辑-1 补充>> 我刚注意到,这可能是因为远程的 "django.contrib.sessions.middleware.SessionMiddleware",Django 正在尝试将默认会话保存到数据库中。我是为了 Django 管理表单而添加的这个中间件。所以我想我可能需要添加一些中间件来绕过我的简单 API,但我仍在寻找合适的东西,就像在我的简单视图顶部添加的某个装饰器,这样就不测试会话了。所以我还在寻找推荐!

编辑-2 补充>> 我对会话中间件的想法是错误的,因为我使用的是简单视图,而不是 ApiView。为了确认,我禁用了所有中间件来查看影响,但简单请求仍然会与数据库建立连接。更有趣的是,我在设置中还有两个数据库,而我的主数据库在我进行简单 API 调用的负载测试时也会从其他数据库获取连接。(我在负载测试运行时通过 "show processlist" 命令直接从 MySQL 检查了这一点)

1 个回答

2

第一步:实现一个自定义的数据库后端,并在数据库初始化时抛出一个异常。

from django.db.backends.postgresql_psycopg2 import base   

class DatabaseWrapper(base.DatabaseWrapper):
   def __init__(self, *args, **kwargs):
       raise RuntimeError('db access restricted')

第二步:查看错误追踪信息,找出是谁想要使用这个数据库。

抱歉我的英语不好。

撰写回答