Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Mixin在每次页面加载时返回一个随机对象_Python_Django - Fatal编程技术网

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

Python Mixin在每次页面加载时返回一个随机对象,python,django,Python,Django,我正在尝试编写一个mixin,动态生成一个随机的Amazon附属公司广告。我不确定这是否是处理事情的最佳方式(例如,在模型本身中定义一个返回随机项的方法会更好吗?)。但我就是这样 我有两个应用程序:事件和广告。我在广告.视图中的混音看起来像: class AmazonAdvertisingMixin(object): config = { # Amazon Config } api = amazonproduct.API(cfg=config)

我正在尝试编写一个mixin,动态生成一个随机的Amazon附属公司广告。我不确定这是否是处理事情的最佳方式(例如,在模型本身中定义一个返回随机项的方法会更好吗?)。但我就是这样

我有两个应用程序:
事件
广告
。我在
广告.视图中的混音看起来像:

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


对于实现最终目标,我也愿意接受其他建议:在每个页面加载时,从数据库中随机选择一个
广告。想法?

我很确定ad代码只在进程启动时运行一次。不是每个页面请求都重新加载模型,而是初始化一次

如果将广告逻辑放入
get\u context\u data
中,它应该在每个请求上加载一个随机广告,因为每个请求都会调用
get\u context\u data

我问了一个问题:

类属性在类的所有实例中共享 进程,并且由于一个进程跨越多个请求,因此数据将 在这些请求中保持一致


宾果,成功了!不敢相信我没有考虑嵌套在<代码> GET-CONTXEXDATA()/<代码>…doh!非常感谢。请注意,您正在查询整个查询集的数据库。您可以使用
ad=advision.objects.filter(网络?).order\u by('?')[0]
,或者使用
ads.exists()
代替
len(ads)>0
。如果您有大量的数据库条目,这将节省大量开销。@knbk我认为
.order\u by('?')
是应该避免的,因为它是一个“昂贵的”查询…不是吗?他们说是的。也许它不适用于PostgreSQL?你是对的,我不应该推荐它。我一直认为它有点慢,但显然查询可能需要几分钟。但是,如果您试图获取一个包含1000万行的数据库的所有记录(这是
len(ads)
所做的),您仍然会面临相同的性能问题。