首页 > 解决方案 > 如何为 django 的(1.11)URL 调度程序添加日志跟踪(不适用于生产)

问题描述

我有一个旧的(Django 1.11)超过复杂的 Django 应用程序,具有重叠和有趣排序的 url 匹配规则,我想将它更新到更新的 Django 版本并简化/重构。

为了更好地理解 Id' 喜欢(手动)浏览应用程序并检索一些痕迹

是否可以在不必在每个视图中添加日志语句的情况下实现以下操作。

我想获得跟踪,告诉我 url 调度程序选择了哪个规则(如果可能,但不是真的必要),哪个视图调用了哪个参数。

例如,我可以肯定,某些​​规则可以被删除,因为它们不再使用。

示例:如果我有以下(不复杂的非重叠规则)url 调度程序规则。

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app1/', app1.views.top_view),
    url(r'^app1/a', app1.views.a_view),
]

我访问了http://myserver/app1。我想有一个跟踪告诉我,http://myserver/app1触发的规则^app1/和(不太重要的)视图app1.views.top_view将用于处理请求。

midllewares、decorators、monkeypatches,只要我不必更改所有单独的规则和所有视图来获取我的踪迹,什么都可以。即使是相当大的性能损失也不是问题,这是用于调试的

附言

我知道django-extensions模块和管理命令show_urls

这已经很有帮助,但是对于在我的应用程序中显示的更复杂的 url,我希望进行日志记录。

标签: pythondjangodebuggingloggingdjango-views

解决方案


您可能必须先升级到 2.2,或者将此提交反向移植,否则您无法从路由器获取有关它用于解析请求 URI 的精确匹配的信息。

也就是说,它应该在请求阶段在中间件中完成。ResolverMatch 实例在 WSGIRequest 中作为 request.resolver_match 可用。使用上面的修复,为每个请求添加一个日志是微不足道的。

如果你不能向后移植或升级,有一种方法可以做到,这基本上涉及在所有已知 urlconfs 的启动时构建一个缓存,然后匹配每个,我已经在某个时候完成了它,但没有放置它周围了。您基本上必须完成 URLResolver.resolve() 的工作,然后在创建 ResolverMatch 实例时将路由添加到它。希望这可以帮助您入门。


推荐阅读