簡體   English   中英

登錄在 Django Rest 框架中有效,但在前端無效

[英]Login works in Django Rest Framework but not on frontend

我有以下看法:

登錄視圖

@api_view(['POST'])
def login_view(request):

    try:
        user_data = request.data
        username = user_data["username"]
        password = user_data["password"]
        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            serializer = UserSerializer(user)
            return Response(
            {
                "user":serializer.data,
                "login": True
            })
        else:
            return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST)
    except:
        raise Http404

注銷視圖

@api_view(['POST'])
def logout_view(request):
    if request.user.is_authenticated:
        logout(request)
        return Response(status=status.HTTP_200_OK)
    else:
        return Response(status=status.HTTP_403_FORBIDDEN)

並在前端獲取 function :

const onSubmit = () => {
    fetch('http://127.0.0.1:8000/api/login/',{
        method:"POST",
        headers: {
          'Accept': 'application/json, text/plain',
          'Content-Type': 'application/json; charset=UTF-8'
        },
        body: JSON.stringify({
          "username": values.Username,
          "password": values.Password
        })
        }).then((response) => {response.json().then(data => {                  
        if(response.ok){
            setError('');           
            console.log(data);
      } 
      else{
        setError('');
        setError('Invalid Username or Password');  
      }
    })});
  };

以及以下問題:

當我嘗試在前端登錄時,我得到了預期的響應:

{
  user: {id: 4, username: 'Tester_1', date_joined: '2021-12-02T22:38:29.323393Z', trust_index: 0}
  login: true
}

但我的用戶未登錄 Rest 框架,我無法在前端使用注銷視圖:在前端登錄后

當我使用 Rest 框架面板進行登錄時,一切正常,用戶已登錄,我可以使用注銷視圖:在 Rest 框架中登錄后

我已經為此苦苦掙扎了一段時間。 任何想法如何解決這個問題?

我不知道您的全局代碼,但您似乎正在嘗試創建基於 session 的登錄/身份驗證系統,將自動生成的 drf web 面板方法帶到您的面前。 在這種分離的結構(正面和背面)中,這不是最好的方法,至少您構建了一個奇怪的結構,其中 Django 封裝了您的正面和管理會話等。

一種可能更好的方法是使用 jwt 令牌生成/身份驗證。 您使用用戶和密碼進行身份驗證(從前面),但您(從后面)接收到必須在本地存儲的令牌(本地存儲,以模擬會話)。

在每個請求中,您傳遞 header 中的令牌,如果一切正常(有效令牌)drf 做這些事情。

我使用簡單的 JWT ( https://django-rest-framework-simplejwt.readthedocs.io/en/latest/ )。 真的很簡單。

在前面,Axios 是一個很好的 js 庫,可以使用攔截器自動傳遞數據獲取令牌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM