我试图编写一个动态生成随机Amazon Affiliates广告的mixin。我不确定这是否是处理事情的最佳方式(例如,在模型本身中定义一个返回随机项的方法会更好吗?)......但是这里有' s我在哪里。
我有两个应用:events
和advertisements
。我在advertisements.views
中的mixin看起来像是:
class AmazonAdvertisingMixin(object):
config = {
# Amazon Config
}
api = amazonproduct.API(cfg=config)
# Get all ads from the database
ads = Advertisement.objects.filter(network__exact='Amazon')
if len(ads) > 0:
ad = random.choice(ads)
# Get the ASIN from a random ad
asin = ad.ASIN
result = api.item_lookup(asin, ResponseGroup='Images, Small')
advertisement = {
'product_url': result.Items.Item['DetailPageURL']
}
def get_context_data(self, **kwargs):
context = super(AmazonAdvertisingMixin, self).get_context_data(**kwargs)
context['advertisement'] = self.advertisement
return context
然后在我的events.views
中,我有FormView
,如下所示:
class ContactFormView(AmazonAdvertisingMixin, FormView):
form_class = ContactForm
template_name = "contact.html"
# etc, etc...
这适用于在联系页面上显示广告。唯一的问题是......当我刷新页面时,广告总是一样的。它几乎就像mixin只运行一次一样。有没有办法在每次加载页面时重新运行它,以便我可以获取新的asin
?
我也对实现最终目标的其他建议持开放态度:在每个页面加载时从数据库中选择一个随机advertisement
。想法?
答案 0 :(得分:2)
我非常确定广告代码在流程启动时只运行一次。不会为每个页面请求重新加载模型,而是初始化一次,
如果您将广告逻辑放在get_context_data
中,则应在每个请求中加载随机广告,因为每个请求都会调用get_context_data
来自similar的问题:
类属性在a中的所有类实例之间共享 进程,并且由于进程持续多个请求,因此数据将会 坚持这些要求。