>source

나는 사용하고있다장고 수비수,watch_login () 내 사용자 정의 로그인보기에 무차별 대입 방지를 추가하는 데코레이터 :

def user_login(request):
    if request.user.is_authenticated:
        if request.user.is_active:
            return redirect('home:home')   
    if request.method == 'POST':    
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return redirect('home:home')
            else:
                return HttpResponse('Account is disabled')
        else:
            messages.error(request,'Sorry, the username or password you entered is not correct')     
            return redirect('main:user_login')           
    return render(request, 'main/user_login.html')

그러나 내 데코레이터로 함수를 래핑하면 urls.py 파일 오류가 발생합니다. 'function' object has no attribute 'get' .

나는 데코레이터를 사용해 보았습니다. views.py 단순히 수행함으로써 인수없이 @watch_login() . 그러나 그것은 작동하지 않는 것 같습니다. 이 래퍼를 내 함수에 어떻게 추가 할 수 있습니까? urls.py 파일?

나는 또한 이것을 시도했다 :urls.py와 views.py의 함수 래핑/데코레이션

그리고 여전히 동일한 오류가 발생합니다 ( 'function' object has no attribute 'get' )

편집하다

또한 다음 방법을 사용하여 HttpResponseRedirect를 시도했지만 최대 로그인 제한에 도달 한 후에도 사용자가 차단되지 않습니다.

사용자가 잘못된 자격 증명을 제출하면 다음을 수행합니다.

url = reverse('main:user_login')
return HttpResponseRedirect(url, status=302) 

그리고 내 장식 자로서 나는 :

@watch_login(status_code=302)

여전히 작동하지 않는 것 같습니다. 그리고 내가 할 때 cleanup_django_defender 내 데이터베이스에 저장된 시도가 없음을 알 수 있습니다.

** 편집-문제 해결 **

이 문제를 해결하기 위해 새 HttpStatus 및 새 HttpStatus로 리디렉션되므로 리디렉션하지 않고 잘못된 로그인시 템플릿을 다시 렌더링해야했습니다. watch_login() 사실을 반환하지 않습니다.

이제 로그인 시도가 실패하면 다음과 같이 간단합니다.

return render(request, 'main/user_login.html')

  • 답변 # 1

    에서 @watch_login() 독 스트링 :

    To make it work on normal functions just pass the status code that should indicate a failure and/or a string that will be checked within the response body.

    당신의 user_login() 함수는 오류시 특정 상태 코드 (및/또는 메시지)를 반환해야합니다.

    테스트 1의 예 :

    @watch_login(status_code=401)
    def fake_api_401_login_view_without_msg(request):
        """ Fake the api login with 401 """
        return HttpResponse(status=401)
    
    

    테스트 2의 예 :

    @watch_login(status_code=401, msg="Invalid credentials")
    def fake_api_401_login_view_without_msg(request):
        """ Fake the api login with 401 """
        return HttpResponse("Sorry, Invalid credentials", status=401)
    
    

    편집하다

    로그인 실패시 리디렉션하는 경우이 조건은 @watch_login() true로 평가되지 않습니다 (왜냐하면 response.status_code == 302 ).

    if status_code == 302:  # standard Django login view
        login_unsuccessful = (
            response
            and not response.has_header("location")
            and response.status_code != status_code
        )
    
    

관련 자료

  • 이전 c# - API 결과는 Json (반복되는 부모)의 모든 중첩 된 불필요한 클래스를 채 웁니다
  • 다음 react-native의 thisstateplaces에 정의되지 않은 오류