我的Django views.py中有很多类似的函数,就像这样开始:
@login_required
def processMyObject(request, myObjectID, myObjectSlug=None):
logger.info("In processMyObject(myObjectID=%s, myObjectSlug=%s)" % (myObjectID, myObjectSlug))
try:
myObject = MyObject.objects.get(id=myObjectID)
except:
logger.error("Failed to get MyObject Object by ID")
raise "Failed to get MyObject Object by ID"
if myObjectSlug != None and myObject.slug != myObjectSlug:
logger.error("myObjectSlug '%s' doesn't match myObject #%s's slug" % (myObjectSlug, myObject.id))
raise "myObjectSlug '%s' doesn't match myObject #%s's slug" % (myObjectSlug, myObject.id)
这些函数中的每一个都具有相同的参数签名,并在顶部包含相同的代码块,但接着继续实现一些独特的功能。然而,这是每个中的常见代码。对于我而言,似乎是一次可怕的违反DRY的行为,因此我多次输入相同的代码。
如何使用继承或其他技术来优雅地分解这些代码,使其只出现一次但在每个视图函数中使用?
答案 0 :(得分:0)
您可以编写从视图接收MyObjectId和slug作为参数的装饰器。记录信息行,如果缺少对象则引发错误。
只需检查有关函数装饰器的信息,并阅读django代码以获取示例。例如,查找您正在使用的装饰器的代码(login_required)并在django.contrib.auth.decorators中查找user_passes_test装饰器。这可能是您案件的最佳实例。
然后在需要它的每个视图前面使用装饰器 - 就像你使用@login_required一样