如何在Django(异步编程)中并行执行任务?

2024-04-27 01:08:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个简单的视图。如果请求用户已经有一天没有看到该对象的现有用户帐户或ip地址,我只想计算查看次数。我正在使用Django和Djangorest框架

下面是一些检索操作的示例代码

def get_ip_address(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip


def create_post_view(post, user, request):
    print("before sleeping")
    PostView.objects.create(post=post,
                            user=user,
                            ip_address=get_ip_address(request)
                            )
    post.view_count += 1
    post.save(update_fields=("view_count", ))
    print(post)

class PostModelViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = [IsAdminOrReadOnly, ]
    pagination_class = DefaultLimitOffsetPagination

    def retrieve(self, request, *args, **kwargs):
        obj = self.get_object()
        user = request.user if request.user.id else None
        vwd = PostView.objects.filter(post=obj.id,
                                      user=user,
                                      ip_address=get_ip_address(request),
                                      viewed_on__startswith=date.today())
        if not vwd:
            create_post_view(obj, user, request)
        obj.view_count += 1
        return Response(PostDetailSerializer(obj).data,
                        status=status.HTTP_200_OK)

这很简单。我从数据库中获取请求对象,并检查用户是否在一天内查看了该对象或查看了相同的ip地址。如果post对象没有被查看,我只需要创建PostView实例,这意味着下一个视图不会在被查看的当天被计算在内

我的问题是:我如何运行它,让它返回Response对象,同时启动函数,而不是等待它完成

提前谢谢


Tags: 对象ipviewobjforgetifaddress
1条回答
网友
1楼 · 发布于 2024-04-27 01:08:40

你可以用芹菜。但是,考虑到问题的简单性,我认为使用django后台任务更容易https://django-background-tasks.readthedocs.io/en/latest/

就这么简单:

  1. 在函数中添加装饰器
@background
def create_post_view
  1. 调用函数
create_post_view(....,schedule=timezone.now()) # at a specific time

所需的函数将异步执行

相关问题 更多 >