Django @login_required 실패 경우 이동 페이지

@login_required 데코레이터를 설정해 둔 경우, 실패한 경우 어떤 페이지가 뜨기는 하는데 내가 따로 설정한 적이 없는 것 같은데, 어디서 설정해 주나?

 

알아보다 보니 settings.py 에 설정 되어 있어서 코드에서 볼 수 없었다.

 

settings.py 에 보면 "LOGIN_URL" 이라는 값을 설정해 둔 곳이 있다.

# settings.py
...
LOGIN_URL = '/login/'
...

 

@login_required 데코레이터가 실패시 여기 설정된 페이지로 자동으로 이동 시켜 주도록 장고가 설정 되어 있다는 것.

 

이게 싫은 경우에는 어떻게 해야 하나?

별도의 데코레이터 함수를 따로 작성하면 되는 것은 당연한데 더 편하게 해 주는 것은 없을까?

 

추후 업데이트 할련다.

 

로그인 실패 페이지 바로 설정하기

(업데이트) 바로 login_required 에 실패시 이동 페이지 정보를 바로 주면 된다.

 

@api_router.get("error", response={403: Message})
def user_error(request):
    msg = "Forbidden"
    return {"msg": msg}
    

@api_router.get("company/{companyid}", response=CompanySchema)
@login_required(login_url='/api/error')
def get_company_id(request, companyid: int):
	...

 

위의 코드에서 @login_required(login_url=원하는이동페이지주소) 이렇게 주면 된다.

 

나는 api 호출의 경우에 사용할 것이므로 간단하게 Error code 만 리턴하는 페이지를 위에 만들어서 그쪽으로 보내도록 해 두었다. 

 

원하는 대로 되어서 다행이긴 하다......불안한 건 왜지?

장고 공식 페이지 있으니 걱정 덜어

https://docs.djangoproject.com/en/3.2/topics/auth/default/#django.contrib.auth.decorators.login_required

 

Using the Django authentication system | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

login_required() also takes an optional login_url parameter. Example:

from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')
def my_view(request):
    ...

Note that if you don’t specify the login_url parameter, you’ll need to ensure that the settings.LOGIN_URL and your login view are properly associated. For example, using the defaults, add the following lines to your URLconf:

 

꽁꽁 숨겨둔 settings.py 장고

Rene Asmussen 님의 사진, 출처: Pexels