我有一个视图,安排芹菜任务在您访问网址时运行:
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
答案 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,只需不要公开。