如何修复异常值:“模块”对象不可调用

时间:2019-06-27 15:43:09

标签: django django-views

我在这行中的问题:

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 个答案:

答案 0 :(得分:1)

基于comments,您对Django中CSRF的实现方式有误解。

  

有必要为模板提供csrf。我尝试不使用此字符串来执行此操作,但是出现了csrf错误。

是正确的。但是您无需将此添加到上下文变量。如果您使用Camera作为中间件,则CSRF令牌的检查会自动进行。

您需要做的是在模板中定义{% csrf_token %} template tag [Django-doc],例如:

'django.middleware.csrf.CsrfViewMiddleware'

在该视图中,无需生成或检查CSRF令牌。

在您看来,您应该检查<form method="post" action="..."> {% csrf_token %} <!-- ... --> </form>而不是request.method == 'POST',因为可以在没有数据的情况下发出POST请求。

根据PEP-8,建议使用带下划线的小写字母编写函数。

最后,如果您创建一个redirect(..),则最好使用视图名称。如果您稍后更改该视图的路径,则重定向到的URL也将更改。

if request.POST