0

我有一个 API,如果不允许用户访问它,我会将其重定向到另一个视图以及添加到请求会话的用户消息,并使用该信息使用 django 消息框架在模板中显示消息。在这个过程中,当我查看重定向视图时,从一个视图传递的会话数据会丢失。而且这只发生在生产环境中。

这是代码。

意见 -

def data_asset_alert_track(request, edf_data_asset_id):
    data_asset = EdfDataAsset.objects.get(data_asset_id=edf_data_asset_id)
    x_app_role = access_control.get_xapp_role(request)
    roles = access_control.get_roles(x_app_role)
    user = User.objects.get(username=request.user)
    is_edit_permitted = (access_control.has_edit_all_access(roles, 'edfdataasset'))\
                        or (True if data_asset.owner_id and data_asset.owner.owner_id == user.username else False)\
                        or (access_control.is_auth_user(data_asset.owner, user) if data_asset.owner_id else False)
    if not is_edit_permitted:
        request.session['message'] = 'Unauthorized Action: Edit DataAsset - %s not permitted'%data_asset.data_asset_name
        return HttpResponseRedirect(reverse('data_assets'))

    if data_asset.alert_fl is False:
       data_asset.alert_fl = 'True'
    else:
       data_asset.alert_fl = 'False'

    data_asset.save()

    return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))

Redirected to view- 
def data_assets(request):  
    if 'message' in request.session:
        logr.info("There is a message")
    messages.add_message(request, messages.ERROR, "A trial message")
    data_asset_list = EdfDataAsset.objects.select_related('provider').order_by('data_asset_name')
    field_filter = DataAssetFilter(request.GET, queryset=data_asset_list)
    context = {'data_asset_list': data_asset_list, 'filter': field_filter, }
    return render(request, 'edf/data_assets.html', context)

这在所有开发和测试环境中都可以正常工作。可能是什么问题?

我尝试在 settings.py 中添加这两个设置。还是不行

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'

SESSION_COOKIE_SECURE = 假

4

1 回答 1

0

当您返回HttpResponseRedirect时,我认为您的请求不会通过中间件进行 - 这意味着您的会话将不会被保存。

为了正确处理这个问题,我建议你使用 Django 的 . 直接进入你的data_asset_alert_track视野。

这应该在你看来

def data_asset_alert_track(request, edf_data_asset_id):
    data_asset = EdfDataAsset.objects.get(data_asset_id=edf_data_asset_id)
    x_app_role = access_control.get_xapp_role(request)
    roles = access_control.get_roles(x_app_role)
    user = User.objects.get(username=request.user)
    is_edit_permitted = (access_control.has_edit_all_access(roles, 'edfdataasset'))\
                        or (True if data_asset.owner_id and data_asset.owner.owner_id == user.username else False)\
                        or (access_control.is_auth_user(data_asset.owner, user) if data_asset.owner_id else False)
    if not is_edit_permitted:
        messages.add_message(request, messages.ERROR, 'Unauthorized Action: Edit DataAsset - %s not permitted')
        return HttpResponseRedirect(reverse('data_assets'))

    if data_asset.alert_fl is False:
       data_asset.alert_fl = 'True'
    else:
       data_asset.alert_fl = 'False'

    data_asset.save()

    return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))

在您的重定向视图中

def data_assets(request):  
    data_asset_list = EdfDataAsset.objects.select_related('provider').order_by('data_asset_name')
    field_filter = DataAssetFilter(request.GET, queryset=data_asset_list)
    context = {'data_asset_list': data_asset_list, 'filter': field_filter, }
    return render(request, 'edf/data_assets.html', context)
于 2019-11-28T06:32:34.897 回答