2010-07-01 56 views
4

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

它发生有些sporatically,我们可以有一段由重装三次重现:

  • 首先F5:404
  • 二F5:404
  • 三F5:对象的变化形式加载正确

但最近它已经返回404往往不是。这似乎减少了当我们反弹Apache(优雅地)并且随着更多请求变得更糟(再次,看起来)时返回404的可能性。

上快速CGI运行Django 1.2.1/MySQL的5.1.x版

FWIW,我不能重现该问题上我的虚拟机,但我跑mod_wsgi的存在,并在调试=真集设置。否则代码和数据库是相同的。

回答

4

我有这个相同的问题。对我来说,解决方案是将我的呼叫移至admin.site.register()admin.py。将DEBUG设置为false时,您的模型会延迟加载,因此注册调用并不总是会被完成。然而,显然admin.py始终是在init时间加载的。

+0

你的admin.site.register()调用会在哪里?我已经在每个应用程序的admin.py中,但现在只能在带有apache的产品而不是manage.py runserver中获得此问题 – radtek 2015-01-01 19:43:00

0

查看是否在结束时的备用WSGI脚本:

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

有差别。

+0

尝试了替代的wsgi.py脚本,并没有为我工作。我得到的404页面也被破坏,所有静态图片都不显示,翻译被破坏。其他网址上的404页面正常工作。 (django 1.6.8和mod_wsgi apache) – radtek 2015-01-02 05:05:25

+0

那篇博文现在已经过时了,不应该使用。从那以后,Django发生了很大的变化。 – 2015-01-03 06:56:04

+0

apache mod_wsgi的行为与say gunicorn + wsgi不同,所以我只有在mod_wsgi上运行时才遇到这个404问题。问题原来是init之外有条件声明的对象变量。在Beanstalk中运行的mod_wsgi并不喜欢它,但在其他地方运行良好。这甚至有意义吗?虽然在我的情况非常具体的问题。 – radtek 2015-01-03 07:18:29

1

直到上周我都有同样的问题。在我追踪这个错误几个月后,我发现404在django源代码中提升。

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

不知何故django无法在queryset中找到包含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的源东西一件好事,所以在使用您自担风险!