Python Django - 在视图中访问响应头文件

问题描述:

我正在研究一个Web应用程序,它与所有具有唯一ID的实体一起工作。Python Django - 在视图中访问响应头文件

我有一个用户创建这些实体的提交表单,这个表单有几个步骤(例如,视图1重定向到视图2等等直到提交过程结束)。

第一个视图将在表单提交后创建实体的ID,然后我需要使用在其他视图中创建的实例的ID。

我不想将这个ID作为URL参数传递给其他视图,因为这些将是POST,这意味着用户可以轻松操作这些并在模型中为多个ID创建记录。我设法使用会话参数(request.session)将此ID传递给多个视图,但这并不理想,因为这对于会话是永久的。下面当前代码:

def view1(request): 
if request.method == 'POST': 
    form = xxx_creation_form(request.POST) 
    if form.is_valid(): 
     cleaned_form_data = form.cleaned_data 
     xxx_entry = Model.objects.create(
     ... object creation ... 
     ) 
    request.session['xxx_id'] = xxx_entry.id 
    return HttpResponseRedirect(reverse('form_2')) 
else: 
    form = xxx_creation_form() 
return render(request, 'xxx_form.html', {'form': form}) 

def view2(request): 
xxx_id = request.session['property_id'] 
if xxx_id == 'SET_BACK_BLANK': 
    return render(request, 'no_xxx_id.html') 
if request.method == 'POST': 
    form = xxx_form2(request.POST) 
    if form.is_valid(): 
     cleaned_form_data = form.cleaned_data 
     xxx_entry = Model.objects.create(
     id = xxx_id, #use the id created in step 1 
     ... rest of object creation ... 
     ) 
     request.session['xxx_id'] = 'SET_BACK_BLANK' #to avoid the misuse during other user interactions. 
     return HttpResponseRedirect(reverse('thanks')) 
else: 
    form = xxx_form2() 
return render(request, 'xxx_form2.html', {'form': form}) 

理想的情况下,我想通过这个ID参数中的响应,因为这的报头将避免具有ID作为会话参数。所以,我修改了代码以下:

def view1(request): 
if request.method == 'POST': 
    form = xxx_creation_form(request.POST) 
    if form.is_valid(): 
     cleaned_form_data = form.cleaned_data 
     xxx_entry = Model.objects.create(
     ... object creation ... 
     ) 
    response = HttpResponseRedirect(reverse('form_2')) 
    response['xxx_id'] = xxx_entry.id 
    return response 
else: 
    form = xxx_creation_form() 
return render(request, 'xxx_form.html', {'form': form}) 

def view2(request): 
xxx_id = HttpResponseRedirect(request).__getitem__('xxx_id') 
if request.method == 'POST': 
    form = xxx_form2(request.POST) 
    if form.is_valid(): 
     cleaned_form_data = form.cleaned_data 
     xxx_entry = Model.objects.create(
     id = xxx_id, #use the id created in step 1 
     ... rest of object creation ... 
     ) 
     return HttpResponseRedirect(reverse('thanks')) 
else: 
    form = xxx_form2() 
return render(request, 'xxx_form2.html', {'form': form}) 

然而上述不工作和错误信息似乎表明,在响应头没有“xxx_id”。

如果任何人都可以让我知道如何在视图中访问响应的头部,那看起来我们不能修改请求的头部,这将是非常棒的。

感谢。

你所要求的并不合理。响应是从Django发送到浏览器的内容,而不是浏览器发送给Django的内容。这是完全独立的请求;在重定向的情况下,您的响应仅仅是一条指令,让浏览器向新的URL发出请求。

正确的做法是使用会话,因为你正在做。如果您担心价值被持续存在,那么您在使用时将其弹出会话:

xxx_id = request.session.pop('property_id') 
+0

嗨,丹尼尔,非常感谢您的回复。为了澄清HttpResponseRedirect请求/响应循环,我认为使用HttpResponseRedirect创建followin过程是正确的:1 /创建一个HttpResponse对象(请参阅django文档)2 /创建另一个HttpRequest和HttpResponse(这将是重定向)。否则,我认为你的建议是有道理的。谢谢。 – RobinW2

+0

我不确定你在问什么。正如我所说,从您的视图返回重定向是一个指示浏览器请求另一个页面;由于这是一个新的请求,因此在调用视图时会获取新的请求对象。 –

+0

好的谢谢,这是有道理的。我会将上面的答案标记为答案,因为它解决了我的问题。 – RobinW2