Mat*_*mer 14 python django pickle
我在我的Django应用程序中收到此错误,但是,它每天只发生一次或更少,并且证明调试非常困难.
Environment:
Request Method: POST
Django Version: 1.3.1
Python Version: 2.6.6
Installed Applications:
['django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'fimedlabs',
'data',
'djcelery']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'fimedlabs.auth.userMiddleWare')
Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
178. response = middleware_method(request, response)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/sessions/middleware.py" in process_response
36. request.session.save()
File "/usr/local/lib/python2.6/dist-packages/django/contrib/sessions/backends/db.py" in save
57. session_data = self.encode(self._get_session(no_load=must_create)),
File "/usr/local/lib/python2.6/dist-packages/django/contrib/sessions/backends/base.py" in encode
93. pickled = pickle.dumps(session_dict, pickle.HIGHEST_PROTOCOL)
Exception Type: PicklingError at /
Exception Value: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Run Code Online (Sandbox Code Playgroud)
我试过这个答案:
通过向实际错误添加self来查看是否会在Django错误中打印任何内容都无济于事.
在哪里可以打印出来自此错误的问题的对象,以便它出现在Django错误页面中?
谢谢!〜马特
编辑:我存储在缓存中的唯一对象是一个用户对象,代码如下:
class user(object):
username = str()
userid = uuid.UUID(int=0)
client = models.Client()
clientid = uuid.UUID(int=0)
clientname = ''
data = models.User()
accesslevel = models.AccessLevel()
active = False
client_active = False
isFimed = False
isFimedAdmin = False
isClientAdmin = False
isFimedManager = False
mysettingsform = None
viewingas = False
menu = []
_exists = False
_authenticated = False
def __str__(self):
return str(self.__dict__.copy())
def __getstate__(self):
return self.__dict__.copy()
def __setstate__(self, dict):
self.__dict__ = dict
def __init__(self, username=None):
if username:
self.initialize(username)
def initialize(self, username):
self.username = username
model = models.User.objects.filter(username=username).all()
if len(model) == 1:
model = model[0]
self.data = model
self._exists = True
self.userid = self.data.id
self.active = self.data.active
self.isFimed = self.data.isFimed()
self.isFimedAdmin = self.data.isFimedAdmin()
self.isClientAdmin = self.data.isClientAdmin()
self.isFimedManager = self.data.isFimedManager()
self.mysettingsform = UserFormSelf(initial={"id":model.id, "username":model.username, "name":model.name, "email":model.email, "phone":model.phone})
self.accesslevel = models.AccessLevel.objects.filter(id=self.data.accesslevel_id)[:1][0].level
cli = self.data.client
self.client = cli
self.clientid = cli.id
self.clientname = cli.name
if cli.active:
self.client_active = True
model.lastlogin = datetime.datetime.now()
model.save()
self.menu = getMenu(self.data)
else:
self._exists = False
def authenticate(self, password):
self._authenticated = False
if (self.active == False or self.client_active == False):
return False
if self._exists:
import hashlib
hash = hashlib.md5('%s%s' % (str(password), self.data.pwsalt)).hexdigest()
if hash == self.data.pwhash:
self._authenticated = True
return True
return False
def updateUser(self):
self.initialize(models.User.objects.filter(id=self.userid).get().username)
def mkContext(self):
c = Context()
c['menu'] = self.menu
c['user'] = self
c['language'] = language
c['colors'] = colors
c["isFimed"] = self.isFimed
c["isFimedAdmin"] = self.isFimedAdmin
c["isClientAdmin"] = self.isClientAdmin
c["isFimedManager"] = self.isFimedManager
c["mysettingsform"] = self.mysettingsform
return c
Run Code Online (Sandbox Code Playgroud)
编辑:Werkzeug之后的WSGI文件:
import django.core.handlers.wsgi
djangoapplication = django.core.handlers.wsgi.WSGIHandler()
def application(environ, start_response):
if 'SCRIPT_NAME' in environ:
del environ['SCRIPT_NAME']
return djangoapplication(environ, start_response)
# The following lines enable the werkzeug debugger
import django.views.debug
def null_technical_500_response(request, exc_type, exc_value, tb):
raise exc_type, exc_value, tb
django.views.debug.technical_500_response = null_technical_500_response
from werkzeug.debug import DebuggedApplication
application = DebuggedApplication(application, evalex=True)
Run Code Online (Sandbox Code Playgroud)
在我的情况下(不是与Django相关),multiprocessing.Pool.map当lambda作为目标函数传递时抛出了这个异常.创建一个命名函数并通过initargs参数(而不是通过闭包)传递所需的上下文数据结构解决了这个问题.
总而言之,触发异常的不良用例是:
import multiprocessing as mp
context = some_object
pool = mp.Pool()
worker_func = lambda x: work(x, context)
results = pool.map(worker_func, data_list)
Run Code Online (Sandbox Code Playgroud)
小智 6
在哪里可以打印出来自此错误的问题的对象,以便它出现在Django错误页面中?
简短的回答 - 没有重新编译cPickle,你不能.
更长的答案:这是引发异常的一段代码:
root $ grep -Hra "attribute lookup" /usr/lib64/ 2>/dev/null | grep -a failed
/usr/lib64/python2.7/lib-dynload/cPickle.so:H?H???P0H?5zM H?=1??M??H??H?ZM ?????H?=?1?H???M??H??H??M ?????H?4M H?5~H???H?????????H?M H?5tH???H?????????H??L H?5?H???qH?????d???H?M H?5NH???SH?????F???H?dM H?5bH???5H?????(???H?=X1??O??H?HC H?5I H?=U1?A??H??L ?vH??H??I???????H???RK??H?=.H????J??H?5$H??H??H?D$?G??H?D$H??tH?H??H??H??gH?DL?ttH?qH?5nH?=kH??1??XK??H?5bH??H??I????F??H?5\L??H???F??H??tH?EH??H??H?E??M???????I?$H??H??I?$?t???I?DL???P0?d???f?H?EH??H??H?E?F???H?H???P0?7???@H?|$H??P0?????H?H???P0?????H?H???P0?k?????UH??SH?H?H: H???tH?;: H???H?H???u?H?[?Ð?H??M??H??attribute deletion is not supportedunsupported pickle protocol: %dargument must have 'read' and 'readline' attributespickle protocol %d asked for; the highest available protocol is %dargument must have 'write' attributeGlobal and instance pickles are not supported.Attempt to getvalue() a non-list-based picklerUnexpected data in internal listBINSTRING pickle has negative byte countno int where int expected in memoCan't pickle %s: import of module %s failedCan't pickle %s: attribute lookup %s.%s failedCan't pickle %s: it's not the same object as %s.%sCan't pickle %s: extension code %s isn't an integerCan't pickle %s: extension code %ld is out of rangecould not convert string to intLONG pickle has negative byte countcould not convert string to floatBINUNICODE pickle has negative byte countunregistered extension code %ld_inverted_registry[%ld] isn't a 2-tuple of stringsA load persistent id instruction was encountered,
Run Code Online (Sandbox Code Playgroud)
如果你看得足够近,那就有一个说法
Can't pickle %s: attribute lookup %s.%s failed
Run Code Online (Sandbox Code Playgroud)
现在,如果您下载Python源代码,您可以轻松找到负责在以下函数static int save_global(Picklerobject *self, PyObject *args, PyObject *name)中引发异常的代码段./Modules/cPickle.c:
klass = PyObject_GetAttrString(mod, name_str);
if (klass == NULL) {
cPickle_ErrFormat(PicklingError,
"Can't pickle %s: attribute lookup %s.%s "
"failed",
"OSS", args, module, global_name);
goto finally;
}
Run Code Online (Sandbox Code Playgroud)
因此,调试此错误的最佳方法是以不同方式格式化字符串(可能提供PyString_AS_STRING((PyStringObject *)name),重新编译和安装修改后的Python版本).
是的,我知道这太糟糕了.我自己也遇到了同样的问题.
| 归档时间: |
|
| 查看次数: |
21908 次 |
| 最近记录: |