I ran into a bit of a conundrum this week when dealing with a view that required me to pass a very large Python dictionary to a template for navigation and toolbar purposes. Because I’m working with a designer who is using AJAX GETs for entire portions of interactive content, this dictionary had a mixture of navigation, subnavigation and actual object JSON and was constructed via a fairly complex function.
Once the designer I was working with explained just how complex this dictionary (JSON in his terms) was going to be, I started to worry about the view — knowing that millions of simultaneous requests to a view like this would leave my server badly bruised.
Enter cPickle! I realized that this navigation was not going to change after launch, so I could use cPickle to store it in the project’s data directory. This allowed me to circumvent the open database connections and it sped up my view immensely.
def pop_nav():
#code that populates dict
fn = os.path.join(os.path.dirname(__file__), 'data/nav')
f = open(fn,'w')
pickle.dump(simplejson.dumps(content_list),f)
f.close()
As you can see, I can run this in iPython anytime to update the nav, in case something should change. Here’s the section of the view that handles it.
def view(request,element):
#code for various other pieces of view
fn = os.path.join(os.path.dirname(__file__), 'data/nav')
f = open(fn,'r')
nav = pickle.load(simplejson.dumps(content_list),f)
f.close()
Now it’s ready to send to the template. :)
Although I’m sure this is not quite as speedy as it would be if I were using a NoSQL DB to store all my objects, I highly recommend it for those projects that have large queries that will remain mainly static after launch.