Skip to main content
 首页 » 编程设计

python之Django rest_framework.views 如何跳过简单 rest API 的数据库连接

2025年05月04日40小虾米

有没有办法禁用 django rest 框架的默认行为,以便它不查找后端数据库?在我的项目中,我有几个不需要数据库的简单 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:连接 ==> 65 毫秒
  • WSGI/响应 ==> 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

Edit-1 Addition>> 我刚刚注意到这可能是由于 Django 试图在数据库中保存默认 session 的远程“django.contrib.sessions.middleware.SessionMiddleware”而发生的。这是我为 django 管理表单添加的。所以我想我可能需要添加一些中间件来为我的简单 API 绕过它,但我仍在寻找合适的东西,就像我在简单 View 顶部添加的一些装饰器一样,它不会测试 session 。所以仍在寻找建议!

Edit-2 Addition>> 我对 session 中间件的想法是错误的,因为我使用的是简单 View 而不是 (ApiView),只是为了确认我禁用了所有中间件以查看影响,但是一个简单的请求仍然与数据库建立连接。更有趣的是,我的设置中还有 2 个数据库,当我对简单的 API 调用进行负载测试时,我的主数据库也从其他数据库获得连接。 (我在负载测试运行时通过“show processlist”命令直接从 MySql 检查了我的)

请您参考如下方法:

第一步。实现自定义数据库后端并在数据库初始化时引发异常

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

第二步。查看回溯并确定谁想要 db

抱歉我的英语不好