有没有办法request
对象从一个视图传递到另一个视图?还是我必须将请求分解为单独的部分或使用request.__dict__
并传递这些部分?
Currenlty,因为请求无法序列化,所以下面的代码:
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='> 不可序列化 JSON
但是我需要从最后一个函数中的第一个函数中获得请求数据,因为它的代码从请求中提取了一些数据。
您遇到的问题不是在这些函数之间传递request
,而是celery
需要传递给 celery 任务的参数才能序列化。
这里的简单解决方案是从请求中提取所需的属性,然后将这些属性传递给任务。
所以而不是
task = collect_activities.delay(request)
做
code = request.GET.get('code', '')
task = collect_activities.delay(code)
当然,您需要更改collect_activities
任务定义,以接受代码作为参数,而不是请求对象。
我发现这个: Django 将对象从视图传递到下一个进行处理
顶部答案使用会话来传递保存对象并在以后检索它:
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})