2017-08-29 79 views
0

我试图在Django视图之间共享一些数据。我有一种观点,让我在“Mwfrs建筑”这个课堂上进行实习。该类有几个属性,属性和cached_property。将类实例中的数据存储到request.session

例如:

from django.utils.functional import cached_property 

class MwfrsBuildings: 

    def __init__(self, form_cleaned_data): 
     for key, value in form_cleaned_data.items(): 
      setattr(self, key, value) 

    @property 
    def foo(self): 
     pass 

    @cached_property 
    def bar(self): 
     pass 

我需要从属性和属性数据。我有以下观点:

def buildings(request): 
    if request.POST and request.is_ajax(): 
     s_form = BuildingForm(request.POST) 
     if s_form.is_valid(): 
      method = MwfrsBuildings(s_form.cleaned_data) 
      html = render_to_string('wind/results/buildings/buildings_results.html', 
            {'method': method}) 
      request.session['building_method'] = method.__dict__ 
      return JsonResponse({"result": html}) 
    else: 
      return JsonResponse({'building_errors': s_form.errors}, 
           status=400) 

因为我不能存储实例化的类,我存储使用__dict__方法的数据。这适用于类属性和cached_property,但不适用于属性。

如何将类属性存储在request.session

可以通过instanciated类request.session

-------------------- UPDATE ------------------------

我不知道这是不是一个好习惯,但我想通过使用Pickle。例如:

import pickle 

def buildings(request): 
    if request.POST and request.is_ajax(): 
     s_form = BuildingForm(request.POST) 
     if s_form.is_valid(): 
      method = MwfrsBuildings(s_form.cleaned_data) 
      html = render_to_string('wind/results/buildings/buildings_results.html', 
            {'method': method}) 
      with open("building.pickle", "wb") as outfile: 
       pickle.dump(method, outfile) 
      return JsonResponse({"result": html}) 
    else: 
      return JsonResponse({'building_errors': s_form.errors}, 
           status=400) 

然后在其他视图:

def buildings(request): 
    # some code 
    with open("building.pickle", 'rb') as outfile: 
     method = pickle.load(outfile) 
    # Then use the instanciated class 

__

+0

如果我是你,我会写一个serialiser来保存你的对象到一个字典,而不是'__dict__'。或者你可以重载你的类的'__dict__'方法,但是通常你会从'__dict__'获得更多的内容。这样,您可以节省您的所需。 – dirkgroten

+0

你能告诉我一个例子吗?还是参考? – Eduardo

回答

0

您可以尝试在你的MwfrsBuildings类中创建一个to_json()from_json()实例方法,如

class MwfrsBuildings(object): 
    ... 
    def to_json(self): 
    data = dict() 
    data['my_field'] = self.my_field 
    ... 
    return json.dumps(data) 

    @classmethod 
    def from_json(cls, json_data): 
    data = json.loads(json_data) 
    return cls(my_field=data['my_field'], ...) 

然后你可以做这样的事情你的观点:

request.session['mydata'] = my_object.to_json() 
... 
my_object = MwfrsBuildings.from_json(request.session['mydata']) 
相关问题