Django:如何将请求对象从一个视图传递到另一个视图?

时间:2018-12-26 17:48:58

标签: python django celery

是否可以将request对象从一个视图传递到另一个视图?还是我必须将请求分解为多个部分,或者使用request.__dict__并将其传递?

货币,由于请求无法序列化,因此以下代码:

def explorer(request):
    collect_activities_init(request)
    return render(request, 'explorer/explorer.html')

def collect_activities_init(request):
    task = collect_activities.delay(request)
    return JsonResponse({'status_url': reverse('explorer:collect_activities_status', kwargs={'task_id': task.id})})

@celery.task(bind=True)
def collect_activities(self, request):
    api = StravaApi()
    code = request.GET.get('code', '') # extract code from redirect URL query string

会给:

  

WSGIRequest:GET   '/ explorer /?state =&code = 3ba4hgh5ad99ea3cf8e52d8&scope ='>   不可序列化

但是我需要从第一个函数的第一个函数获取请求数据,因为它的代码从请求中提取了一些数据。

2 个答案:

答案 0 :(得分:1)

我发现了这个:Django pass object from view to next for processing

最重要的答案是使用会话,以便传递保存对象并在以后检索它:

def first_view(request):
    my_thing = {'foo' : 'bar'}
    request.session['my_thing'] = my_thing
    return render(request, 'some_template.html')

def second_view(request):
    my_thing = request.session.get('my_thing', None)
    return render(request, 'some_other_template.html', {'my_thing' : my_thing})

答案 1 :(得分:1)

您遇到的问题不是在这些函数之间传递request,而是celery需要传递给celery任务的参数进行序列化。

这里的简单解决方案是从请求中提取所需的属性,然后将其传递给任务。

所以不是

task = collect_activities.delay(request)

code = request.GET.get('code', '')
task = collect_activities.delay(code)

当然,您需要更改collect_activities任务定义以接受代码作为参数,而不是请求对象。