Я пишу функцию-оболочку для Django render_to_response(), чтобы добавить обработку CSRF.
Логика такова:
def some_view (request)
dictionary = {'context_param': some_param}
dictionary.update(csrf(request))
# ... view code here
return render_to_response("a_template.html", dictionary)
render_to_response() имеет следующую подпись:
def render_to_response(*args, **kwargs)
Я хочу написать прозрачную оболочку - просто добавить некоторые функции (упомянутые ранее) и оставить все как есть. Я думаю, что я должен написать что-то вроде этого:
def csrf_response (request, *args, **kwargs):
# Here I need to somehow extract dictionary from args or kwargs
if dictionary is None:
dictionary = {}
dictionary.update(csrf(request))
# And here I somehow need to pass dictionary into render_to_response() fot the furher processing
return render_to_response(*args, **kwargs)
Итак, вопрос: как лучше всего извлечь необходимый параметр из args/kwargs (затем изменить его) и передать дальше?
Кстати, код render_to_response() показался мне немного странным. Вот:
def render_to_response(*args, **kwargs):
"""
Returns a HttpResponse whose content is filled with the result of calling
django.template.loader.render_to_string() with the passed arguments.
"""
httpresponse_kwargs = {'mimetype': kwargs.pop('mimetype', None)}
return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
Что, если кто-то вызовет его со всеми позиционными аргументами, поэтому kwargs будет пустым, но параметр mimetype
будет указан как последний позиционный аргумент? Похоже, в этом случае его поведение было бы неправильным.
dict
- это необязательный параметр функцииrender_to_response()
, которая описана в документации следующим образом:render_to_response(template[, dictionary][, context_instance][, mimetype])
09.05.2011