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