我有一个看起来像这样的Django应用程序:
class Server(models.Model):
hostname = models.CharField(max_length=100)
# this field stores encrypted credentials
admin_credentials = models.TextField()
def get_admin_credentials(self):
return decrypt(self.admin_credentials)
由于Django的模板语言允许模板调用其上下文变量的方法(不需要参数),因此模板通过包含以下代码来泄漏这些凭证似乎太容易了:
{{ server.get_admin_credentials }}
如何阻止模板直接使用get_admin_credentials()
方法?
答案 0 :(得分:5)
模板API文档中记录了这一点:https://docs.djangoproject.com/en/stable/ref/templates/api/#variables-and-lookups
有时您可能会出于其他原因关闭此功能,并告诉模板系统保留一个未调用的变量,无论如何。为此,请在callable上设置do_not_call_in_templates属性,其值为True。然后,模板系统将表现为您的变量不可调用(例如,允许您访问可调用的属性)。
要执行此操作,请更改您的函数以设置do_not_call_in_templates
标志:
def get_admin_credentials(self):
return decrypt(self.admin_credentials)
get_admin_credentials.do_not_call_in_templates = True