【问题标题】:How to run a python function on every Admin page load in Django如何在 Django 中的每个管理页面加载上运行 python 函数
【发布时间】:2014-09-07 01:48:05
【问题描述】:

我希望在加载管理界面的页面时运行 python 函数。这不需要在每个页面加载(即非管理员相关页面)上运行。此函数需要请求对象或用户 ID。

我知道我可以创建一个新视图并从页面中的 javascript 调用它,但这似乎是一种可怕的做法。有没有办法以某种方式将功能附加到管理页面加载服务器端而不添加任何额外的依赖项?

更新:该功能用于连接到一种日志系统,该系统每天跟踪每个用户的第一次/最后一次交互,每当用户使用管理界面时都需要更新这些交互。看起来中间件应用程序可以让我做我想做的事,谢谢你们!

【问题讨论】:

  • 你在说什么样的“Python函数”?它有什么作用?最佳解决方案取决于功能。

标签: python django python-3.x django-admin


【解决方案1】:

我会用一种简单的方法来处理它。查找管理员必须执行的功能,例如save_model()。然后把你自己的函数放进去。

【讨论】:

  • 这样做太糟糕了。黑客就是那个“黑客”。
  • 这适用于仅在保存对象时触发的事件,但即使没有执行保存,我也需要它在页面加载时运行。我实际上使用这种方法来保存用户上次编辑的内容或用户创建的某些对象。
  • 是的,它有限制。
【解决方案2】:

免责声明:我对 Django pers 的内部结构或 API 知之甚少。

你需要使用/编写的是一个中间件组件。

见:Django Middleware

简单的例子:

类LocaleMiddleware(对象):

def process_request(self, request):

    if 'locale' in request.cookies:
        request.locale = request.cookies.locale
    else:
        request.locale = None

def process_response(self, request, response):

    if getattr(request, 'locale', False):
        response.cookies['locale'] = request.locale

另请参阅:来自 Effective Django 的Understanding Django Middleware

【讨论】:

    【解决方案3】:

    一种方法是创建一个中间件并检查每个页面请求是否是管理页面:

    https://docs.djangoproject.com/en/dev/topics/http/middleware/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多