Django 管理员去抖动

Posted

技术标签:

【中文标题】Django 管理员去抖动【英文标题】:Django Admin Debounce 【发布时间】:2020-09-06 23:20:32 【问题描述】:

我正在使用Python Django Admin,并尽可能少地使用自定义模板和 javascript 代码。

有没有办法debounce点击特定按钮(或表单提交)?

例如如果用户在保存按钮上单击两次(在短时间内),则应该只调用一次。

【问题讨论】:

【参考方案1】:

如果您不想要任何自定义模板或 javascript,一种方法是对任何视图进行速率限制,该按钮将向其发送请求。例如,“保存”按钮将向change_view 视图发送请求,因此您可以在此设置速率限制器。像这样的东西应该可以工作:

from ratelimit.decorators import ratelimit

class YourAdminClass(admin.ModelAdmin):

    @ratelimit(key='ip', rate='1/s')
    def change_view(elf, request, object_id, form_url='', extra_context=None):
        # anything else you want to do
        return super().change_view(request, object_id, form_url, extra_context)

对于任何给定的 IP 地址,这将允许每秒最多 1 个。请注意,您需要安装Django Ratelimit。另外,请注意我从未亲自使用过它,它只是我在谷歌上搜索时出现的第一个库。

但是……

为什么需要这个特殊功能。 Django 管理界面不应该被用作面向客户的站点。唯一使用它的人应该是您公司/您为/自己创建网站的公司内的人。 IMO,它应该只被其他开发人员真正使用,但也许并非在所有情况下都是如此,也许在您的情况下并非如此。考虑到这一切,问问自己这是否是你真正需要的功能。

【讨论】:

上下文:公司内部使用。一开始大约有5个人。现在已经100+了。他们在管理工具中执行的某些操作或操作将使用独特的令牌等向用户发送通知/邮件/短信。一些公司用户正在双击而不是单击按钮。另一种方法是修复通知相关的代码......但像往常一样,我们需要快速的解决方案。 啊,我明白了。是的,不是很理想。以上方法有效吗? 蒂姆,我没试过。我尝试了别的东西。我创建了装饰器:gist.github.com/adnansinanovic/03d424fb1a160d8774ca1b24b80d521d 并像这样使用它:@DebounceSaveModel(300) def save_model(self, request, obj, form, change):但我对此并不满意。【参考方案2】:

我找到了解决方案。这并不理想(我讨厌它),但它确实有效。

我不得不写一些 JS 代码。幸运的是 django 管理模板已经扩展,所以我不得不在里面放一行:

<script type="text/javascript" src="% static "admin/js/debounce_form.js" %"></script>

debounce_form.js 看起来像这样:

(function ($) 
function debounce(wait) 
  const STATUS_PENDING = 1;
  const STATUS_DONE = 2;

  return 
    status: STATUS_PENDING,
    timeout: null,
    isDone: function()
      return this.state === STATUS_DONE;
    ,
    reset: function() 
      this.status = STATUS_PENDING;
    ,
    execute: function(target) 
      args = this;

      var later = function() 
        args.timeout = null;
        args.status = STATUS_DONE;
        target.submit();
      ;

      args.status = STATUS_PENDING;
      clearTimeout(this.timeout);
      args.timeout = setTimeout(later, wait);
    
  


var submit = debounce(250);

$( "form" ).submit(function( e ) 
  // debounce multiple form submission
  if (submit.isDone() === false) 
    e.preventDefault();
    e.stopPropagation();
    submit.execute(e.target);
    return;
  

  submit.reset();
);

)(django.jQuery);

【讨论】:

以上是关于Django 管理员去抖动的主要内容,如果未能解决你的问题,请参考以下文章

存储管理-局部性原理和抖动问题

[django]上下文管理器

Android 性能优化--内存优化--(内存优化工具内存管理机制内存抖动内存泄漏)

Android 性能优化--内存优化--(内存优化工具内存管理机制内存抖动内存泄漏)

Android 性能优化--内存优化--(内存优化工具内存管理机制内存抖动内存泄漏)

Android 性能优化--内存优化--(内存优化工具内存管理机制内存抖动内存泄漏)