将RedisFeed
和Stream-Framework
和Django
一起使用时,我遇到序列化问题。即使我在celery设置中明确定义使用pickle
作为数据交换格式,我仍然面临以下错误。
feeds.py
from stream_framework.feeds.redis import RedisFeed
class PostFeed(RedisFeed):
key_format = 'feed:normal:%(user_id)s'
class UserPostFeed(PostFeed):
key_format = 'feed:user:%(user_id)s'
managers.py
from stream_framework.feed_managers.base import FanoutPriority, Manager
from stream_feed.feeds import PostFeed, UserPostFeed
from stream_feed.models import Follow, Post
class PostManager(Manager):
feed_classes = {'normal': PostFeed}
user_feed_class = UserPostFeed
def add_post(self, post: Post):
activity = post.create_activity()
# add user activity adds it to the user feed, and starts the fanout
self.add_user_activity(post.user.id, activity)
def get_user_follower_ids(self, user_id: int):
ids = Follow.objects.filter(
target=user_id).values_list('user_id', flat=True)
return {FanoutPriority.HIGH: ids}
post_manager = PostManager()
models.py
class Post(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
heading = models.CharField(max_length=160, null=True)
text = models.TextField(null=False)
created_at = models.DateTimeField(auto_now_add=True)
image = models.ImageField(upload_to=get_file_path, null=True, blank=True)
tags = models.ManyToManyField(Tag)
likes = GenericRelation('Like', related_query_name='post')
def save(self, *args, **kwargs):
self.text = html_clean(self.text)
super(Post, self).save(*args, **kwargs)
@classmethod
def activity_related_models(cls):
return ['user']
@property
def activity_object_attr(self):
return self
def create_activity(self):
return Activity(actor=self.user.id,
verb=PostVerb,
object=self.pk,
time=datetime.utcnow())
settings.py
BROKER_URL = 'redis://{}:{}'.format(REDIS_ADDRESS, REDIS_PORT)
CELERY_ACCEPT_CONTENT = ['pickle']
CELERY_RESULT_BACKEND = 'amqp'
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_EVENT_SERIALIZER = 'pickle'
CELERY_RESULT_SERIALIZER = 'pickle'
BROKER_POOL_LIMIT = None