def test_unpickling(self): self.assertEqual(unpickle_context(pickle_context(Context())), flatten_context(Context())) context = Context({'test_var': 'TEST'}) pickled_context = pickle_context(context) unpickled_context = unpickle_context(pickled_context) self.assertEqual(flatten_context(context), unpickled_context)
def render(self, context): # our main context storage = Context() # stash the whole context if needed if settings.KEEP_CONTEXT: storage.update(flatten_context(context)) # but check if there are variables specifically wanted for var_name in self.var_names: if var_name[0] in ('"', "'") and var_name[-1] == var_name[0]: var_name = var_name[1:-1] try: storage[var_name] = Variable(var_name).resolve(context) except VariableDoesNotExist: raise TemplateSyntaxError( '"phased" tag got an unknown variable: %r' % var_name) # lastly return the pre phased template part return u'%(delimiter)s%(content)s%(pickled_context)s%(pickled_components)s%(delimiter)s' % { 'content': self.content, 'delimiter': settings.SECRET_DELIMITER, 'pickled_context': pickle_context(backup_csrf_token(context, storage)), 'pickled_components': pickle_components(self.components), }
def test_unpickling_with_template_and_pattern(self): context = Context({'test_var': 'TEST'}) template = '<!-- better be careful %s yikes -->' pattern = re.compile(r'.*<!-- better be careful (.*) yikes -->.*') pickled_context = pickle_context(context, template) unpickled_context = unpickle_context(pickled_context, pattern) self.assertEqual(flatten_context(context), unpickled_context)
def render(self, context): # our main context storage = Context() # stash the whole context if needed if getattr(settings, 'PHASED_KEEP_CONTEXT', False): storage.update(flatten_context(context)) # but check if there are variables specifically wanted for var_name in self.var_names: if var_name[0] in ('"', "'") and var_name[-1] == var_name[0]: var_name = var_name[1:-1] try: storage[var_name] = Variable(var_name).resolve(context) except VariableDoesNotExist: raise TemplateSyntaxError( '"phased" tag got an unknown variable: %r' % var_name) storage = backup_csrf_token(context, storage) # lastly return the pre phased template part return u'%(delimiter)s%(content)s%(pickled)s%(delimiter)s' % { 'content': self.content, 'delimiter': settings.PHASED_SECRET_DELIMITER, 'pickled': pickle_context(storage), }
def test_flatten_nested(self): context = Context({'test_var': 'TEST'}) context.update(Context({'test_var': 'TEST2', 'abc': 'def'})) self.assertEqual(flatten_context(context), { 'test_var': 'TEST2', 'abc': 'def' })
def render(self, context): # our main context storage = Context() # stash the whole context if needed if getattr(settings, 'PHASED_KEEP_CONTEXT', False): storage.update(flatten_context(context)) # but check if there are variables specifically wanted for var_name in self.var_names: if var_name[0] in ('"', "'") and var_name[-1] == var_name[0]: var_name = var_name[1:-1] try: storage[var_name] = Variable(var_name).resolve(context) except VariableDoesNotExist: pass storage = backup_csrf_token(context, storage) # lastly return the pre phased template part return u'%(delimiter)s%(content)s%(pickled)s%(delimiter)s' % { 'content': self.content, 'delimiter': settings.PHASED_SECRET_DELIMITER, 'pickled': pickle_context(storage), }
def test_phased(self): context = Context({'test_var': 'TEST'}) first_render = compile_string(self.test_template, None).render(context) original_context = unpickle_context(first_render) self.assertNotEqual(flatten_context(context), original_context) pickled_context = '{# context "gAJ9cQFVCmNzcmZfdG9rZW5xAlULTk9UUFJPVklERURxA3Mu" endcontext #}' pickled_components = '{# components "gAJdcQFVH3BoYXNlZC50ZW1wbGF0ZXRhZ3MucGhhc2VkX3RhZ3NxAmEu" endcomponents #}' self.assertEqual(first_render, '%(delimiter)s{%% if 1 %%}test{%% endif %%}%(pickled_context)s%(pickled_components)s%(delimiter)sTEST' % dict(delimiter=settings.SECRET_DELIMITER, pickled_context=pickled_context, pickled_components=pickled_components))
def test_phased(self): context = Context({'test_var': 'TEST'}) first_render = compile_string(self.test_template, None).render(context) original_context = unpickle_context(first_render) self.assertNotEqual(flatten_context(context), original_context) pickled_context = pickle_context(Context({'csrf_token': 'NOTPROVIDED'})) self.assertEqual(first_render, '%(delimiter)s{%% if 1 %%}test{%% endif %%}%(pickled_context)s%(delimiter)sTEST' % dict(delimiter=settings.PHASED_SECRET_DELIMITER, pickled_context=pickled_context))
def pickle_context(context, template=None): """ Pickle the given Context instance and do a few optimzations before. """ pickle = get_pickle() if not isinstance(context, BaseContext): raise TemplateSyntaxError('Phased context is not a Context instance') pickled_context = pickle.dumps(flatten_context(context), protocol=pickle.HIGHEST_PROTOCOL) if template is None: template = '{# stashed context: "%s" #}' return template % base64.standard_b64encode(pickled_context)
def test_flatten_nested(self): context = Context({'test_var': 'TEST'}) context.update(Context({'test_var': 'TEST2', 'abc': 'def'})) self.assertEqual(flatten_context(context), {'test_var': 'TEST2', 'abc': 'def'})