Mixin在每个页面加载时返回一个随机对象

时间:2014-11-30 16:11:37

标签: python django

我试图编写一个动态生成随机Amazon Affiliates广告的mixin。我不确定这是否是处理事情的最佳方式(例如,在模型本身中定义一个返回随机项的方法会更好吗?)......但是这里有' s我在哪里。

我有两个应用:eventsadvertisements。我在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。想法?

1 个答案:

答案 0 :(得分:2)

我非常确定广告代码在流程启动时只运行一次。不会为每个页面请求重新加载模型,而是初始化一次,

如果您将广告逻辑放在get_context_data中,则应在每个请求中加载随机广告,因为每个请求都会调用get_context_data

来自similar的问题:

  

类属性在a中的所有类实例之间共享   进程,并且由于进程持续多个请求,因此数据将会   坚持这些要求。