Python Django - 在 View 中访问响应 header

标签 python django header httpresponse

我正在开发一个 Web 应用程序,该应用程序与所有具有唯一 ID 的实体一起使用。

我有一个提交表单,供用户创建这些实体,该表单分为几个步骤(即 View 1 重定向到 View 2,等等......直到提交过程结束)。

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

我不想将此 ID 作为 URL 参数传递给其他 View ,因为这些 View 将是 POST,这意味着用户可以轻松地操作这些 View 并在模型中为多个 ID 创建记录。我已经设法使用 session 参数(request.session)将此 ID 传递给多个 View ,但这并不理想,因为这对于 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”。

如果有人能让我知道如何在 View 中访问响应的 header ,那就太好了,因为我们似乎无法修改请求的 header 。

谢谢。

最佳答案

你问的根本没有意义。响应是从 Django 发送到浏览器的内容,而不是浏览器发送到 Django 的内容。这是一个完全独立的请求;在重定向的情况下,您的响应只是指示浏览器向新 URL 发出请求。

正确的做法是使用 session ,就像您正在做的那样。如果您担心该值会被持久化,请在使用时将其从 session 中弹出:

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

关于Python Django - 在 View 中访问响应 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42040119/

相关文章:

python - 以 UUID 作为 id 字段的自定义 Django 用户模型

jquery - 从下拉菜单中获取选定元素的列表到 Django View

头文件中的 C typedef 在文件范围内可变修改

c++ - 如何在 GCC 搜索路径中包含头文件?

javascript - Access-Control-Allow-Headers 不允许请求 header 字段 Access-Control-Allow-Headers

python - 带有 islice 的生成器循环中可能存在内存泄漏

Python:用于运行 Excel VBA 脚本的脚本未运行

python - 如何生成仅包含 1's and 0' s 的 14x10 矩阵的所有可能组合

python - 使用 python 或 bash 自动安装 Docker 和镜像拉取

json - 替换 EAV 时 JSON(B) 中的数据完整性