Django Admin 编辑模型时偶尔返回404
我们正在使用Django的管理后台来维护一些数据,这些数据会导出到我们的一些网站上。有时候,当我们在标准的更改列表视图中点击进入模型编辑表单时,反而会被引导到一个Django的404页面。
这种情况有时会发生,我们一度可以通过刷新三次来重现这个问题:
- 第一次按F5:404
- 第二次按F5:404
- 第三次按F5:对象更改表单正常加载
但最近,这种404错误的出现频率似乎更高了。当我们优雅地重启apache时,出现404的几率似乎会降低,而请求越多,问题似乎越严重。
我们在使用Django 1.2.1,搭配Fast-CGI和MySQL 5.1.x。
顺便说一下,我在我的虚拟机上无法重现这个问题,但我在那里的设置中使用了mod_wsgi,并且将Debug设置为True。否则,代码和数据库是完全相同的。
3 个回答
看看下面这个链接里的替代WSGI脚本是否有帮助:
http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html
试试这个脚本,看看效果怎么样。
我上周也遇到了同样的问题。在追踪这个错误几个月后,我发现是在Django的源代码中出现了404错误。
我修改了这个文件:/path/to/django/contrib/admin/options.py,具体是ModuleAdmin类里的get_object()方法。注意:我使用的是Django 1.3.1。
出于某种原因,Django在查询集中找不到带有主键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的源代码并不是个好主意,所以请自行承担风险!
我也遇到过同样的问题。对我来说,解决办法是把我调用 admin.site.register()
的代码移动到 admin.py
文件里。当你把 DEBUG 设置为 false 时,你的模型是懒加载的,这意味着注册的调用不一定会被执行。不过,听说 admin.py
文件在初始化时总是会被加载。