根据来自其他视图

时间:2016-09-14 17:41:38

标签: django

我有一个视图,安排芹菜任务在您访问网址时运行:

class ScheduleTask(View):

    def get(self, request, *args, **kwargs):
        obj = get_object_or_404(ObjModel, uuid=kwargs.get('obj', None))
        context = {
            'site': RequestSite(request),
            'secure': request.is_secure()
        }    
        schedule_task.delay(obj.uuid, context) # schedule celery task
        return redirect(reverse(
            'users:user-list',
            kwargs={'user': obj.user.uuid}))

我想阻止任何人只是将此视图的网址输入浏览器(因为它会安排任务。)我想提出一个权限被拒绝的例外,如果他们这样做的话。我只想从其他视图访问它:

class CompletionView(TemplateView):
    def post(self, request, *args, **kwargs):

        ...

        if 'save_and_submit' in request.POST:
            # This is the only place I would like ScheduleTask to
            # run from.
            return redirect(reverse('users:schedule-task',
                kwargs={'obj': obj_uuid}))

我怎样才能做到这一点?我觉得我应该设置一些令牌或cookie,但我不完全确定。也许ScheduleTask视图甚至不是必需的,我应该把代码放在if 'save_and_submit' in request.POST

之后

1 个答案:

答案 0 :(得分:1)

我猜你只使用其中一个API就可以完全实现你所做的事情,你只需从你的CompletionView调用你的芹菜任务。

class CompletionView(TemplateView):
    def post(self, request, *args, **kwargs):

        ...

        if 'save_and_submit' in request.POST:
            # This is the only place I would like ScheduleTask to
            # run from.
             schedule_task.delay(obj.uuid, context)
             return redirect(reverse(
                'users:user-list',
               kwargs={'user': obj.user.uuid}))

事实上,如果您不希望公开此API,只需不要公开