【问题标题】:Django Admin Intermittently Returning 404 On Model EditDjango 管理员在模型编辑时间歇性地返回 404
【发布时间】:2010-07-01 14:12:37
【问题描述】:

我们使用 Django Admin 来维护一些导出到我们一些站点的数据。有时,当单击标准更改列表视图以获取模型编辑表单而不是被路由到正确的页面时,我们会得到 Django 404 页面/模板。

这只是偶尔发生,我们可以在一段时间内通过重新加载 3 次来重现它:

  • 第一个 F5:404
  • 第二个 F5:404
  • 第三次 F5:对象更改表单正确加载

但最近它经常返回 404。当我们(优雅地)弹跳 apache 时返回 404 的几率似乎降低了,并且随着请求的增加而变得更糟(再次看起来)。

在 Fast-CGI/MySQL 5.1.x 上运行 Django 1.2.1

FWIW,我无法在我的 VM 上重现该问题,但我正在那里运行 mod_wsgi 并在设置中设置了 Debug=True。否则代码和数据库是相同的。

【问题讨论】:

    标签: python django django-admin http-status-code-404


    【解决方案1】:

    我遇到了同样的问题。我的解决方案是将我的电话转移到admin.site.register()admin.py。将 DEBUG 设置为 false 时,您的模型会延迟加载,因此注册调用并不总是会进行。然而,显然admin.py 总是在初始化时加载。

    【讨论】:

    • 您的 admin.site.register() 调用还会在哪里?我的已经在每个应用程序的 admin.py 中,但现在仅在使用 apache 的 prod 中而不是在 manage.py runserver 中遇到此问题
    • 嗨@radtek,你能解决这个问题吗,我只在产品上遇到同样的问题。
    • 是的,我通过将admin.site.register() 移至admin.py 解决了这个问题
    【解决方案2】:

    直到上周我都遇到了同样的问题。在我跟踪这个错误几个月后,我发现 404 在 django 源代码中引发。

    我修改了 ModuleAdmin 类的文件 /path/to/django/contrib/admin/options.py get_object() 方法。 注意:我使用 Django 1.3.1

    不知何故,django 在查询集中找不到带有 pk object_id 的对象。所以我修改它是这样的:

    def get_object(self, request, object_id):
        ....
        queryset = self.queryset(request)
        model = queryset.model
        obj = None
    
        #first search the object with original way
        try:
            object_id = model._meta.pk.to_python(object_id)
            obj = queryset.get(pk=object_id)
        except:
            #print "DEBUG: > first try does not exist (%s)" % str(object_id)
            obj = None
    
        if obj is None: 
            #if object doesn't exist in queryset, search in db
            try:
                object_id = model._meta.pk.to_python(object_id)
                obj = model.objects.get(pk=object_id)
                #print "DEBUG: > second try found %s" % str(obj)
            except (model.DoesNotExist, ValidationError):
                #print "DEBUG: > second try does not exist"
                obj = None
        return obj
    

    我知道更改 django 源代码中的某些内容不是一件好事,所以使用风险自负!

    【讨论】:

      【解决方案3】:

      看看结尾是否有替代的WSGI脚本:

      http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

      有所作为。

      【讨论】:

      • 尝试了替代的 wsgi.py 脚本,但对我不起作用。我得到的 404 页面也坏了,所有静态图像都没有显示,翻译坏了。其他 url 上的 404 页面工作正常。 (django 1.6.8 和 mod_wsgi apache)
      • 那篇博文现在已经过时了,不应该被使用。从那时起,Django 发生了很大变化。
      • apache mod_wsgi 的行为与 gunicorn + wsgi 不同,所以我只在 mod_wsgi 上运行时遇到了这个 404 问题。问题原来是在 init 之外有条件地声明的对象变量。在 Beanstalk 中运行的 mod_wsgi 不喜欢它,但在其他地方运行良好。这甚至有意义吗?就我而言,这是一个非常具体的问题。
      • 不,你的描述没有意义,所以不知道你在说什么。如果您想进一步研究它,请使用 mod_wsgi 邮件列表询问它以及为什么 gunicorn 行为不同。
      • 我已经按照上面的方法解决了这个问题。只是不确定为什么 mod_wsgi 和 gunicorn /wsgi 会给我不同的结果。我不会再追求它了。
      猜你喜欢
      • 2021-08-18
      • 2020-04-03
      • 2018-11-27
      • 2019-12-12
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2012-07-18
      • 2023-03-14
      相关资源
      最近更新 更多