Django "login ()은 정확히 1 개의 인수 (2 개)"오류를받습니다.


86

django.contrib.auth.login을 사용하여 세션에 사용자 ID를 저장하려고합니다. 그러나 예상대로 작동하지 않습니다.

오류가 발생합니다. login ()은 정확히 1 개의 인수 (2 개)를받습니다.

login (user)을 사용하면 / login / User에서 AttributeError가 발생합니다. 객체에 'method'속성이 없습니다.

약간 수정 된 예제 양식 http://docs.djangoproject.com/en/dev/topics/auth/ 사용하고 있습니다 .

from django.shortcuts import render_to_response
from django.contrib.auth import authenticate, login

def login(request):
    msg = []
    if request.method == 'POST':
        username = request.POST['u']
        password = request.POST['p']
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                msg.append("login successful")
            else:
                msg.append("disabled account")
        else:
            msg.append("invalid login")
    return render_to_response('login.html', {'errors': msg})

login.html에는 특별한 것이 없습니다.

<html>
<head>
    <title></title>
</head>
<body>
    <form action="/login/" method="post">
        Login:&nbsp; <input type="text" name="u">
    <br/>
        Password:&nbsp; <input type="password" name="p">
        <input type="submit" value="Login">
    </form>
    {% if errors %}
        <ul>
            {% for error in errors %}
            <li>{{ error }}</li>
            {% endfor %}
        </ul>
    {% endif %}

</body>
</html>

아무도 login () 작동하는 방법을 알고 있습니까?


4
당신이보기 이름을 바꾸면 작동합니다
예브게니

제가 찾던 질문과 답변입니다. Contexts vs RequestContexts를 사용하고 csrf_tokens를 생략하는 것과 함께 django에서 로그인을 설정하고 실행하는 동안 내가 저지른 몇 가지 실수 중 하나입니다.
chucksmash 2015 년

여기 장고 사용자에 대한 자습서를 찾을 수 있습니다 lowcoupling.com/post/71289666862/django-the-user-tutorial 또한 복제 및 확인할 수있는 GitHub의 프로젝트가
lowcoupling

답변:


235

뷰 함수는라고도하며 login에 대한 호출은 login(request, user)이 함수를 재귀 적으로 호출하려는 시도로 해석됩니다.

def login(request):
    ...
    login(request, user)

그것은 당신의보기 기능을 이름을 변경하거나 참조하지 않도록하려면 login에서 django.contrib.auth몇 가지 다른 방법이다. 예를 들어 가져 오기를 변경하여 로그인 기능의 이름을 바꿀 수 있습니다.

from django.contrib.auth import login as auth_login

...
auth_login(request, user)

와우, 내가 미친 거라고 생각 장고의 소스 코드를 검색하고 모든 이전 버전을 사용할 노력했다
Mojimi

16

한 가지 가능한 수정 :

from django.contrib import auth

def login(request):
    # ....
    auth.login(request, user)
    # ...

이제 뷰 이름이 django의 뷰 이름을 덮어 쓰지 않습니다.


9

또 다른 방법:

from django.contrib.auth import login as auth_login

그런 다음 auth_login(request, user)대신 login(request, user).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.