防止在模板中呼叫敏感方法
當一個物件暴露給模板上下文時,它的無引數方法是可用的。當這些函式是 getters
時,這很有用。但如果這些方法改變某些資料或產生一些副作用,則可能會產生危險。儘管你可能信任模板編寫者,但他可能不會意識到函式的副作用,或者認為錯誤地呼叫了錯誤的屬性。
鑑於以下模型:
class Foobar(models.Model):
points_credit = models.IntegerField()
def credit_points(self, nb_points=1):
"""Credit points and return the new points credit value."""
self.points_credit = F('points_credit') + nb_points
self.save(update_fields=['points_credit'])
return self.points_credit
如果你錯誤地在模板中寫這個:
You have {{ foobar.credit_points }} points!
這將在每次呼叫模板時增加點數。你甚至可能都沒注意到它。
要防止這種情況,你必須將 alters_data
屬性設定為 True
到具有副作用的方法。這將無法從模板中呼叫它們。
def credit_points(self, nb_points=1):
"""Credit points and return the new points credit value."""
self.points_credit = F('points_credit') + nb_points
self.save(update_fields=['points_credit'])
return self.points_credit
credit_points.alters_data = True