4

通常のDjangoユーザーハンドリングでは、ユーザーがログインするとセッションを保存します。ただし、ユーザーがログインするためにuserena views.pyファイルを読み取った後、ユーザーがどのように追跡されているかがわかりませんでした。で、サイトにログインします。userenaのコードを以下に示します。

def signin(request, auth_form=AuthenticationForm,
       template_name='userena/signin_form.html',
       redirect_field_name=REDIRECT_FIELD_NAME,
       redirect_signin_function=signin_redirect, extra_context=None):
"""
Signin using email or username with password.

Signs a user in by combining email/username with password. If the
combination is correct and the user :func:`is_active` the
:func:`redirect_signin_function` is called with the arguments
``REDIRECT_FIELD_NAME`` and an instance of the :class:`User` whois is
trying the login. The returned value of the function will be the URL that
is redirected to.

A user can also select to be remembered for ``USERENA_REMEMBER_DAYS``.

:param auth_form:
    Form to use for signing the user in. Defaults to the
    :class:`AuthenticationForm` supplied by userena.

:param template_name:
    String defining the name of the template to use. Defaults to
    ``userena/signin_form.html``.

:param redirect_field_name:
    Form field name which contains the value for a redirect to the
    successing page. Defaults to ``next`` and is set in
    ``REDIRECT_FIELD_NAME`` setting.

:param redirect_signin_function:
    Function which handles the redirect. This functions gets the value of
    ``REDIRECT_FIELD_NAME`` and the :class:`User` who has logged in. It
    must return a string which specifies the URI to redirect to.

:param extra_context:
    A dictionary containing extra variables that should be passed to the
    rendered template. The ``form`` key is always the ``auth_form``.

**Context**

``form``
    Form used for authentication supplied by ``auth_form``.

"""
form = auth_form

if request.method == 'POST':
    form = auth_form(request.POST, request.FILES)
    if form.is_valid():
        identification, password, remember_me = (form.cleaned_data['identification'],
                                                 form.cleaned_data['password'],
                                                 form.cleaned_data['remember_me'])
        user = authenticate(identification=identification,
                            password=password)
        if user.is_active:
            login(request, user)
            if remember_me:
                request.session.set_expiry(userena_settings.USERENA_REMEMBER_ME_DAYS[1] * 86400)
            else: request.session.set_expiry(0)

            if userena_settings.USERENA_USE_MESSAGES:
                messages.success(request, _('You have been signed in.'),
                                 fail_silently=True)

            # Whereto now?
            redirect_to = redirect_signin_function(
                request.REQUEST.get(redirect_field_name), user)
            return redirect(redirect_to)
        else:
            return redirect(reverse('userena_disabled',
                                    kwargs={'username': user.username}))

if not extra_context: extra_context = dict()
extra_context.update({
    'form': form,
    'next': request.REQUEST.get(redirect_field_name),
})
return ExtraContextTemplateView.as_view(template_name=template_name,
                                        extra_context=extra_context)(request)
4

1 に答える 1

3

ユーザーは最初にを使用して認証されます

ユーザー=認証(識別=識別、パスワード=パスワード)

https://github.com/django/django/blob/master/django/contrib/auth/backends.pyこのメソッドは、ユーザーが存在する かどうかを確認し、パスワードが正しいかどうかを確認します。

すべてがうまくいけば、ログインメソッドが呼び出されます

ログイン(リクエスト、ユーザー)

ここで見つけることができます https://github.com/django/django/blob/master/django/contrib/auth/views.py

ご覧のとおり、これらはDjangoに同梱されている2つの方法であり、Djangoの一種の「デフォルト」認証パッケージとして機能します。

おそらくミドルウェア(具体的にはSessionMiddlewareとAuthenticationMiddleware)を使用しているため、ユーザーがログインしていることをサイトは認識しています。ミドルウェアは、セッションとユーザーオブジェクトをリクエストに添付します。上記のログイン方法では、ユーザーIDがセッションに保存されます。

詳細については、https://docs.djangoproject.com/en/dev/topics/auth/#authentication-in-web-requestsを参照してください。


あなたのコメントについて:

RequestContextを使用してテンプレートをレンダリングするか、ビューにTemplateResponseを返すようにすることができます。https://docs.djangoproject.com/en/dev/ref/template-response/#using-templateresponse-and-simpletemplateresponseを参照してください

これにより、ユーザーオブジェクトがテンプレートプロセッサに渡されます。次に、テンプレートで次のようなことを行うことができます。

{% if user.is_authenticated %}
 <p>Welcome {{ user.first_name }}</p>
{% else %}
 <p>Please log in</p>
{% endif %}

https://docs.djangoproject.com/en/dev/topics/auth/#id8も参照してください

私の意見では、これの修正バージョンをbase.htmlに入れることは確かに非常に可能です。たとえば、ユーザーがログインしていない場合にログインボタンを表示し、ユーザーがログインしたときにユーザーを自分のプロファイルページに移動させるボタンに置​​き換えます。

于 2012-12-03T15:28:43.257 に答える