web-dev-qa-db-ja.com

Djangoでユーザーをプログラムで認証するにはどうすればよいですか?

Djangoでプログラムでユーザーにログインするにはどうすればよいですか?ユーザーのユーザー名とパスワードを持っています。彼をログインさせてくれる方法はありますか?

34

「プログラム的に」以外の方法はありません。もちろん、これは 文書化された です。

from Django.contrib.auth import authenticate, login
user = authenticate(username = username, password = password)
if user is not None:
    login(request, user)
46
Cat Plus Plus

プログラムでユーザーをログインするときは常に注意してください。エラー「user has no attribute "backend"」が発生する可能性があります。それが以前に起こっていない場合は、バックエンドも設定する必要があります。 これを使用するプロジェクト およびいくつかのサンプルコード:

def splash_register(request):
  if request.session.get('beta'):

    if request.method=='POST':
        userform=MyUserCreationForm(request.POST)
        if userform.is_valid():
            #username of <30 char is required by Django User model.  I'm storing username as a hash of user email 

            user=userform.save(commit=False)
            user.username=hash(user.email)
            user.backend='Django.contrib.auth.backends.ModelBackend'
            user.save()


            username=user.username
            password=str(userform.cleaned_data['password'])
            auth.login(request, user)
            request.session['first_visit']=True
            return HttpResponseRedirect("/")
        else:
            userform=MyUserCreationForm(request.POST)
            return render_to_response("website/splash_register.html", {'userform':userform}, context_instance=RequestContext(request))
    return render_to_response("website/splash_register.html", context_instance=RequestContext(request))     
else:
    return HttpResponseRedirect('/splash/')
6
Sebastian Wozny

受け入れられた答えは間違いなく機能しますが、私はDjango.contrib.auth.forms.AuthenticationFormのような組み込みの認証フォームを使用することを好みますDjango

これが重要な部分を示すスニペットです

form = AuthenticationForm(request, data=request.POST)
if form.is_valid():
    try:
        form.clean()
    except ValidationError:
        # handle error

    login(request, form.get_user())

このアプローチの主な違いは、AuthenticationForm.cleanメソッドがauthentication関数を呼び出し、User.is_activeもチェックすることです。

0
SciGuyMcQ