Как исправить значение исключения: объект «модуль» не вызывается - PullRequest
1 голос
/ 27 июня 2019

Моя проблема в этой строке:

args.update(csrf(request))

Моя функция в vews.py:

def Login(request):
    args = {}
    args.update(csrf(request))
    if request.POST:
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        user = authenticate(username = username, password = password)
        print(user, username, password)
        if user is not None:
            auth.login(request, user)
            return redirect('/')
        else:
            args['login_error'] = "Пользователь не найден"
            return render(request, 'HiPage/Login.html', args)

    else:
        return render(request, 'HiPage/Login.html', args)

Что такое модуль и почему он не вызывается? (Я сделал импорт из csrf)

  File "C:\Users\Dmitry\Desktop\Shop-master\HiPage\views.py", line 51, in Login
    args.update(csrf(request))
TypeError: 'module' object is not callable

1 Ответ

1 голос
/ 27 июня 2019

Исходя из комментариев , вы неправильно понимаете, как CSRF реализован в Django.

необходимо предоставить шаблон csrf.Я пытался сделать это без этой строки, но я получил ошибку csrf.

Это правильно.Но вам не нужно добавлять это в контекстные переменные.Если вы используете 'django.middleware.csrf.CsrfViewMiddleware' в качестве промежуточного программного обеспечения, то проверка токена CSRF происходит автоматически.

Что вам нужно сделать, это определить шаблонный тег {% csrf_token %} [Django-doc] в вашем шаблоне, например:

<form method="post" action="...">
    <b>{% csrf_token %}</b>
    <!-- ... -->
</form>

В представлении нет необходимости создавать или проверять токен CSRF.

По вашему мнению, выследует проверить request.method == 'POST' вместо if request.POST, так как запрос POST может быть сделан без данных.

Согласно PEP-8 также желательно написатьфункции в нижнем регистре с подчеркиванием.

Наконец, если вы сделаете redirect(..), лучше использовать имя представления.Если позже вы измените путь к этому представлению, изменится и URL-адрес, на который вы перенаправляете.

def <b>login</b>(request):
    args = {}
    if <b>request.method == 'POST'</b>:
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        user = authenticate(username=username, password=password)
        print(user, username, password)
        if user is not None:
            auth.login(request, user)
            return redirect('<i>name-of-view</i>')
        else:
            args['login_error'] = "Пользователь не найден"
            return render(request, 'HiPage/Login.html', args)

    else:
        return render(request, 'HiPage/Login.html', args)
...