流框架PostManager对象不可JSON序列化

时间:2018-07-28 03:56:02

标签: python json django pickle stream-framework

RedisFeedStream-FrameworkDjango一起使用时,我遇到序列化问题。即使我在celery设置中明确定义使用pickle作为数据交换格式,我仍然面临以下错误。

参考:https://clbin.com/eV19t

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

0 个答案:

没有答案