1

PHP を置き去りにして、Python と Django で少し作業することを余儀なくされた後、ちょっとした問題にぶつかりました。

私がやろうとしているのは、Django に付属している組み込みのユーザー認証を使用することです。問題は、「login()」関数を使用しようとすると、ユーザーがセッションに保存されないか、保存する必要がある場所に保存されないことです。

私のコードは次のようになります。

@csrf_exempt    
def dologin(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)

    if user is not None:
        if user.is_active:
            login(request, user)
            # Redirect to a success page.
            return render_to_response('bsys/profile.html', {'message': 'Success!', 'user': request.user.get_full_name()})
        else:
            # Return a 'disabled account' error message
            return render_to_response('bsys/login.html', {'message': 'Disabled!'})
    else:
        # Return an 'invalid login' error message.
        return render_to_response('bsys/login.html', {'message': 'Sumthin Wong!'})

だから問題は私が実行したときです:

request.user.get_full_name()

それは言います:

Exception Type: AttributeError   
Exception Value: 'AnonymousUser' object has no attribute 'get_full_name'

したがって、どうやらそれはユーザーにログインしません。

私が同じことをするが、以下を使用するとき:

user.get_full_name()

それは機能し、認証機能も明らかにうまく機能します。したがって、login() には何かがあると思います。

私も試したのは、管理者として管理者ログインを介してログインし、別のビューから同じ request.user.get_full_name() を使用して、正常に動作することでした。

これを解決するためのアイデアはありますか?フレームワークの重要な部分を見逃しただけかもしれません。

4

2 に答える 2

0

ログインの成功時にテンプレートをレンダリングするのはなぜですか? すべての POST された HTTP リクエストと同様に、ユーザーがリクエストを再送信する可能性を減らすために、成功時にリダイレクトすることをお勧めします。

より関連性があるのは、テンプレートがauthコンテキスト プロセッサでコンテキストを取得すると、{{ user }}変数が の値に設定されるため、これで問題が解決すると思いますrequest.user。これは、リクエストの開始時に匿名ユーザーです。リダイレクトすると、新しいリクエストには非匿名request.userの が含まれるため、テンプレートの値は適切に入力される必要があります。

于 2012-09-27T17:10:59.970 に答える
0

ユーザーがログインしていることを確認する方法がこれを引き起こしていると思います。

それ以外の:

if user is not None:

試してみてください:

if user.is_authenticated:

これで、AnonymousUser のケースを回避できます。

(そうかもしれません、頭の上から覚えていません)

if user.is_authenticated():
于 2012-09-27T16:44:22.303 に答える