Django представление дает ошибку Forbidden (токен CSRF отсутствует или неверен.) При использовании пользовательского декоратора для проверки сеанса - PullRequest
1 голос
/ 17 февраля 2020

Я создал пользовательский декоратор, чтобы проверить, активна ли сессия или нет. Ниже приводится определение функции

def session_required(func):
    """
    Decorator to check the session is active or not for logged in user
    :param func: Name of function for which you have to check the session is active or not
    :return:
    """

    def wrap(request, *args, **kwargs):
        """
        Wrapper function for the decorator
        :param request: request parameter for called URL
        :return:
        """
        if not request.session.get("admin_id"):
            return redirect("/")
        func_return = func(request, *args, **kwargs)
        return func_return

    return wrap

. Я использую этот декоратор в представлении соответствующей функции. В некоторых местах он работает абсолютно нормально, но когда я выполняю некоторые операции POST или PUT, это выдает ошибку

Запрещено (токен CSRF отсутствует или неверен.):

My представление на основе функций похоже на

@csrf_exempt
@session_required
def mover_profile_handler(request):
    """
    mover profile handler function for viewing and editing the details
    :param request:
    :return:
    """
    try:
        if request.method == "GET":
            login_id = request.session.get("admin_id")
            login_info_obj = Login.objects.get(id=login_id)
            mover_info_obj = Mover.objects.get(fk_login=login_info_obj)
            country_obj = Country.objects.all()
            currency_obj = CurrencyType.objects.all()
            subscription_detail = SubscriptionMoverDetail.objects.filter(fk_mover=mover_info_obj).order_by("-id")

            # Extracting data for showing the subscription package details
            current_subscription_detail = {}
            subscription_detail_history = []
            for index, item in enumerate(subscription_detail):
                subscription_master_detail = SubscriptionMaster.objects.get(id=item.fk_subscription_master_id)
                subscription_detail_json = {
                    "plan_name": subscription_master_detail.subscription_plan_name,
                    "subscription_start_date": item.subscription_date,
                    "subscription_end_date": item.subscription_end_date,
                    "amount_paid": item.amount_paid,
                    "users": subscription_master_detail.customer_permitted_count
                }
                if index == 0:
                    current_subscription_detail = subscription_detail_json
                else:
                    subscription_detail_history.append(subscription_detail_json)

            return render(request, "mover_profile.html", {
                "mover_info_obj": mover_info_obj,
                "country_obj": country_obj,
                "currency_obj": currency_obj,
                "login_info_obj": login_info_obj,
                "current_subscription_detail": current_subscription_detail,
                "subscription_detail_history": subscription_detail_history
            })
        elif request.method == "PUT":
            request = convert_method_put_to_post(request)
            mover_id = request.POST.get("id")
            if Mover.objects.filter(id=mover_id).exists():
                mover_info_obj = Mover.objects.get(id=mover_id)
                mover_info_obj.mover_name = request.POST.get("name")
                mover_info_obj.address = request.POST.get("address")
                mover_info_obj.phone_no = request.POST.get("phone")
                mover_info_obj.mover_size = request.POST.get("size")
                mover_info_obj.reg_no = request.POST.get("reg_no")
                mover_info_obj.website = request.POST.get("website")
                mover_info_obj.fk_country_id = request.POST.get("country")
                mover_info_obj.fk_currency_id = request.POST.get("currency")
                operational_countries = request.POST.getlist("operational_countries[]")
                mover_info_obj.countries_in_operation.set(operational_countries)
                mover_info_obj.save()
            return HttpResponse("success")
    except Exception as e:
        error_save(str(traceback.format_exc()))
        return redirect('error_handler_500')

Я пробовал с

@ csrf_protect @ csrf_exempt

в представлении, а также пробовал {% csrf_token%} в html Файл

без использования кода @session_required работает абсолютно нормально. Поэтому, пожалуйста, скажите мне, что не так с этим материалом !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...