Python Django - 访问响应 Headers 在视图中
Python Django - Access Response Headers In View
我正在开发一个 Web 应用程序,该应用程序与所有具有唯一 ID 的实体一起工作。
我有一个供用户创建这些实体的提交表单,这个表单分为几个步骤(即视图 1 重定向到视图 2,等等...直到提交过程结束)。
第一个视图将在提交表单后创建实体的 ID,然后我需要使用在其他视图中创建的实例的 ID。
我不想将此 ID 作为 URL 参数传递给其他视图,因为这些将是 POST,这意味着用户可以轻松地操作这些 ID 并在多个模型中创建记录身份证。我已经设法使用 session 参数 (request.session) 将此 ID 传递给多个视图,但这并不理想,因为这对于 session 是永久性的。当前代码如下:
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})
理想情况下,我想在响应的 header 中传递此 ID 参数,因为这将避免将 ID 作为 session 参数。所以我将代码修改为以下内容:
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})
但是上面的方法不起作用,错误消息似乎表明响应 header 中没有 'xxx_id'。
如果有人能让我知道如何在视图中访问响应的 header 就好了,因为我们似乎无法修改请求的 header。
谢谢。
你问的没有道理。响应是 Django 发送给浏览器的,而不是浏览器发送给 Django 的。那是一个完全独立的请求;在重定向的情况下,您的响应只是指示浏览器向新的 URL.
发出该请求
正确的做法是像您一样使用会话。如果担心值被持久化,那就在使用的时候把它从session中弹出:
xxx_id = request.session.pop('property_id')
我正在开发一个 Web 应用程序,该应用程序与所有具有唯一 ID 的实体一起工作。
我有一个供用户创建这些实体的提交表单,这个表单分为几个步骤(即视图 1 重定向到视图 2,等等...直到提交过程结束)。
第一个视图将在提交表单后创建实体的 ID,然后我需要使用在其他视图中创建的实例的 ID。
我不想将此 ID 作为 URL 参数传递给其他视图,因为这些将是 POST,这意味着用户可以轻松地操作这些 ID 并在多个模型中创建记录身份证。我已经设法使用 session 参数 (request.session) 将此 ID 传递给多个视图,但这并不理想,因为这对于 session 是永久性的。当前代码如下:
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})
理想情况下,我想在响应的 header 中传递此 ID 参数,因为这将避免将 ID 作为 session 参数。所以我将代码修改为以下内容:
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})
但是上面的方法不起作用,错误消息似乎表明响应 header 中没有 'xxx_id'。
如果有人能让我知道如何在视图中访问响应的 header 就好了,因为我们似乎无法修改请求的 header。
谢谢。
你问的没有道理。响应是 Django 发送给浏览器的,而不是浏览器发送给 Django 的。那是一个完全独立的请求;在重定向的情况下,您的响应只是指示浏览器向新的 URL.
发出该请求正确的做法是像您一样使用会话。如果担心值被持久化,那就在使用的时候把它从session中弹出:
xxx_id = request.session.pop('property_id')