我正在为 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
参数将被指定为最后一个位置参数怎么办?看起来在那种情况下它的行为是错误的。