从WordPress到Mezzanine — 升级Mezzanine的暗坑

因为小孩的出生,这一个多月博客的更新有些中断。看到有些留言没有及时的回复,感觉有些过意不去。Mezzanine和django都已经更新了,于是决定把本站也更新一下,然后……接连踩了四五个坑……苦不堪言,最后的解决方案也很难说就完美了,现记录如下:

Step 0

首先运行 pip install mezzanine --upgrade 升级mezzanine,一路非常顺利。

然后访问www.scislab.com 意料之中的 500 error……

打开 /var/log/ssl_error_log 看到的是

raise RuntimeError("populate() isnt reentrant")

这个最常见的一个错误,一般来说 sudo apachectl restart 就可以了,但是一旦这么做还搞不定的话,那就不能提供任何信息量了。

Step 1

打开Setting的debug,然后访问网页,看到的是:

AttributeError: type object Setting has no attribute _deferred

一番stackoverflow之后发现这个问题是因为django_modeltranslation需要更新,于是 pip install django_modeltranslation --upgrade

Step 2

重启apache服务, 依然是500错误,不过换了一个:

"mezzanine_pagedown" cannot import patterns

这个比较好办,已经知道是mezzanine_pagedown了,import patterns是url.py的问题,后来一看,发现是patterns已经deprecated了,然后该插件的维护者还没有更新……

逼不得已只能自己去改mezzanine_pagedown package里面的url.py源代码,取消掉import里面的patterns, 然后让urlpattern直接等于一个数组对象:

urlpatterns = [url(r^preview/$, MarkupPreview.as_view(), name=preview)]

Step 3

然后重启apache,果然500错误的内容又换了:

future is not a registered tag library.

一看就是django模板里面引用了一个deprecated的future tag,于是用了一个workaround,在templatetags目录里面建了一个future.py,

# templatetags/future.py
from django.template import Library
from django.template.defaulttags import cycle as cycle_original

register = Library()


@register.tag
def cycle(*args, **kwargs):
return cycle_original(*args, **kwargs)

Step 4

继续重启apache,500错误继续变花样……

django dict expected at most 1 arguments, got 3 context

是因为django/template/context.py 里面的这个类:

class ContextDict(dict):
def __init__(self, context, *args, **kwargs):
super(ContextDict, self).__init__(*args, **kwargs)

context.dicts.append(self)
self.context = context

是一个dict的继承类,而dict只能接受一个 args,而传进去的 args有三个。 好在debug模式下所有的变量都是直接显示在网页上的,所以能看出来*args 的list后两个元素统统是空的dict,在传入的参数部分直接修改库文件,加入一个if,判断dict是否为空,为空则不添加到dicts里面。就是下面代码中的 if dicti 这句话。

def push(self, *args, **kwargs):
dicts = []
for d in args:
if isinstance(d, BaseContext):
for dicti in d.dicts[1:]:
if dicti:
dicts.append(dicti)
else:
if d:
dicts.append(d)
return ContextDict(self, *dicts, **kwargs)

修改源代码,实在是不得已而为之,因为我看了半天context.py 确实看不出这两个空的dict什么时候产生的。直接做出这种quick and dirty的修改,很惭愧。

Step 5

这次终于没有了500错误,一切都恢复了正常。感叹一下……mezzanine升个级真是不容易啊。这次我改了源代码,等下次升级,估计又要折腾了。

  • 版权声明: 本文源自互联网, 于4个月前,由整理发表,共 2010字。
  • 原文链接:点此查看原文