有没有办法禁用 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
抱歉我的英语不好
