我试图在Django的request.session字典中保存一个表单类的实例时遇到了麻烦。我得到了TypeError: expected string or Unicode object, NoneType found。整个回溯是:
File "/home/myuser/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in get_response
response = middleware_method(request, response)
File "/home/myuser/.virtualenvs/myenv/local/lib/python2.7/site-packages/newrelic-2.56.0.42/newrelic/hooks/framework_django.py", line 331, in wrapper
return wrapped(*args, **kwargs)
File "/home/myuser/.virtualenvs/myenv/local/lib/python2.7/site-packages/user_sessions/middleware.py", line 46, in process_response
request.session.save()
File "/home/myuser/.virtualenvs/myenv/local/lib/python2.7/site-packages/user_sessions/backends/db.py", line 73, in save
session_data=self.encode(self._get_session(no_load=must_create)),
File "/home/myuser/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/contrib/sessions/backends/base.py", line 86, in encode
pickled = pickle.dumps(session_dict, pickle.HIGHEST_PROTOCOL)
TypeError: expected string or Unicode object, NoneType found情况如何?
我正在测试图像上传的表单验证。我不允许超过某个限制的文件大小,导致验证错误。绑定到request.POST的表单实例保存在request.session中,例如:
form = PhotoForm(request.POST,request.FILES)
request.session["photo_form"] = form
request.session.modified = True然后,我重定向到一个不同的视图来使用上述表单实例。
我注意到所有这些都成功地工作了很多次,但是对于某些非常非常大的文件,我应该在其中引发验证错误,相反,我得到了上面显示的错误。并不是所有的验证错误都会导致这种情况。目前,模式是只有非常大的文件才会导致这种情况。我搞不懂这事。
有人能弄清楚可能发生的事情,以及可能的解决办法吗?一个说明性的答案将是很好的。我的主要用例是在输入错误时在表单上显示验证错误。
如果我在将绑定的form分配给request.session之前打印它,下面是如何查找验证失败的大文件:
<tr><td colspan="2"><ul class="errorlist"><li>File is beyond acceptable limit (10MB)</li></ul></td></tr>
<tr><th><label for="browse_image_btn">Image:</label></th><td><input accept="image/*" id="browse_image_btn" name="image" style="width: 0.1px;height: 0.1px;opacity: 0;overflow: hidden;position: absolute;z-index: -1;" type="file" /></td></tr>
<tr><th><label for="id_reply">Reply:</label></th><td><textarea autocomplete="off" class="cxl" cols="40" id="id_reply" name="reply" rows="3" style="width:99%;height:70px;border-radius:10px;border: 1px #CFD8DC solid; background-color:#FAFAFA;">
</textarea></td></tr>如果我手动尝试使用以下方法对其进行腌制:
import pickle
request.session["photo_form"] = pickle.dumps(form)我得到了PicklingError: Can't pickle <built-in method write of file object at 0x7f024f1d9db0>: it's not found as __main__.write
发布于 2017-12-04 14:10:33
在将表单对象放入会话之前,您可以尝试使用泡菜来转储表单对象,然后从会话中使用泡菜加载表单对象。
import pickle
request.session["photo_form"] = pickle.dumps(form)
form = pickle.loads(request.session["photo_form"])对不起,您只需将简单类型的数据输入到会话中。
或者您可以将表单对象的模板输出放到会话中,如果这对您来说足够的话。
例如:从as_p()方法返回的内容。但在Django的体系结构设计中,表单是中间可访问的对象,不是为存储而设计的,要存储的对象可以是模型对象或输入数据。对不起,英语很差。
https://stackoverflow.com/questions/47634079
复制相似问题