class CachedSingletonModel(models.Model):
class Meta:
abstract = True
def save(self, *args, **kwargs):
self.pk = 1
super().save(*args, **kwargs)
self.set_cache()
def delete(self, *args, **kwargs):
''' Bypass delete method '''
pass
def set_cache(self):
cache.set(self.__class__.__name__, self)
@classmethod
def load(cls):
if cache.get(cls.__name__) is None:
obj, created = cls.objects.get_or_create(pk=1)
if not created:
obj.set_cache()
return cache.get(cls.__name__)
# создаете свою модель настроек
class Settings(CachedSingletonModel):
... определяете свои поля
my_field = ...
# используете
mysettings = Settings.load()
mysettings.my_field
count = cache.get_or_set(f'ip:{ip_address}', 0, <нужное количество секунд>)
count += 1
if count > <допустимое количество попыток>:
raise Exception('Давай, - до свидания')
else:
cache.set(f'ip:{ip_address}', count, <нужное количество секунд>)
data = .. ваша структура ...
try:
product_image = next(filter(lambda x: 'ProductImage' in x.keys(), data))
except StopIteration:
product_image = None
if product_image:
# работаем дальше с product_image
product_image = list(filter(lambda x: 'ProductImage' in x.keys(), data))
Есть небольшая подсказка, сделать это с помощу eval().
import io
import requests
from lxml import etree
for url in links:
info = requests.get(url)
tree = etree.parse(io.StringIO(info.text), etree.HTMLParser())
rarity = tree.xpath('.//*[@id="largeiteminfo_item_type"]')[0].text
print(rarity, url)
не знаю на сколько это законно, ну опустим это, не суть
import ast
data = {
'Action': [...],
...
}
sorted(map(ast.literal_eval, data['Action']), key=lambda x:(x[1], x[0]), reverse=True)
# [('Terminator Genisys', '2015'),
# ('Terminator Salvation', '2009'),
# ('Terminator 3: Rise of the Machines', '2003'),
# ('Terminal Velocity', '1994'),
# ('Terminator 2: Judgment Day', '1991'),
# ('Terminator, The', '1984')]