Django 사용자 인증 시스템(二) 웹 요청의 인증

13417 단어 django
모든 웹 요청에 Request를 제공합니다.사용자 속성은 현재 사용자를 표시합니다.현재 사용자가 로그인하지 않은 경우 이 속성은 AnonymousUser의 인스턴스이고 그 반대의 경우 User 인스턴스입니다.
당신은 is 를 통과할 수 있습니다authenticated()로 구분합니다(예:
if request.user.is_authenticated():

    # Do something for authenticated users.

else:

    # Do something for anonymous users.


로그인login
login()
로그인 함수에는 HttpRequest 객체와 User 객체가 매개 변수로 필요합니다.login () 은django의session 프레임워크를 사용하여 User의 id를session에 저장합니다.
authenticate()와 login()을 모두 사용합니다.
from django.contrib.auth import authenticate, login



def my_view(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.

        else:

            # Return a 'disabled account' error message

    else:

        # Return an 'invalid login' error message.


로그인 로그아웃 종료
logout()
HttpRequest 객체를 매개 변수로 사용하고 반환 값이 없습니다.예를 들면 다음과 같습니다.
from django.contrib.auth import logout



def logout_view(request):

    logout(request)

    # Redirect to a success page.


액세스 제한
The raw way
Request를 사용합니다.user.is_authenticated() 
리디렉션:
from django.shortcuts import redirect



def my_view(request):

    if not request.user.is_authenticated():

        return redirect('/login/?next=%s' % request.path)

    # ...


또는
from django.shortcuts import render



def my_view(request):

    if not request.user.is_authenticated():

        return render(request, 'myapp/login_error.html')

    # ...


장식기 로진 사용required
login_required([redirect_field_name=REDIRECT_FIELD_NAME, login_url=None]
from django.contrib.auth.decorators import login_required



@login_required

def my_view(request):

    ...


사용자가 로그인하지 않으면 settings로 다시 지정합니다.LOGIN_URL, 현재 URL의 상대 경로를next로 구성하여 키의 검색 문자 쌍을 settings에 추가합니다.LOGIN_URL 뒤로 이동:
/accounts/login/?next=/polls/3/.


query 문자 쌍의 키는 기본값next이며, 스스로 이름을 붙일 수도 있습니다.
from django.contrib.auth.decorators import login_required



@login_required(redirect_field_name='my_redirect_field')

def my_view(request):

    ...


스스로 login 을 정의할 수도 있습니다url:
from django.contrib.auth.decorators import login_required



@login_required(login_url='/accounts/login/')

def my_view(request):

    ...


urls.py에서 정의해야 할 사항:
(r'^accounts/login/$', 'django.contrib.auth.views.login'),


로그인 사용자 테스트
예를 들어, 사용자의 이메일을 테스트하려면 다음과 같이 하십시오.
def my_view(request):

    if not '@example.com' in request.user.email:

        return HttpResponse("You can't vote in this poll.")

    # ...


장식기 사용 가능:
from django.contrib.auth.decorators import user_passes_test



def email_check(user):

    return '@example.com' in user.email



@user_passes_test(email_check)

def my_view(request):

    ...


loginurl:
@user_passes_test(email_check, login_url='/login/')

def my_view(request):

    ...


인증 Views
물론, 우리는 로그인, 로그인, 비밀번호 관리의view 함수를 스스로 정의할 수 있을 뿐만 아니라, 더욱 편리하다.
하지만 Django에 내장된views도 배울 수 있습니다.
Django는 인증views에 대한 기본 템플릿을 제공하지 않습니다. however the template context is documented for each view below.
모든 내장views는 Template Response 실례를 되돌려줍니다. 사용자 정의response 데이터를 쉽게 만들 수 있습니다.
https://github.com/django/django/blob/master/django/contrib/auth/views.py
대부분의 내장 인증views는 URL 이름을 제공합니다.
login(request[, template_name, redirect_field_name, authentication_form,current_app,extra_context])
소스:
def login(request, template_name='registration/login.html',

          redirect_field_name=REDIRECT_FIELD_NAME,

          authentication_form=AuthenticationForm,

          current_app=None, extra_context=None):

    """

    Displays the login form and handles the login action.

    """

    redirect_to = request.POST.get(redirect_field_name,

                                   request.GET.get(redirect_field_name, ''))



    if request.method == "POST":

        form = authentication_form(request, data=request.POST)

        if form.is_valid():



            # Ensure the user-originating redirection url is safe.

            if not is_safe_url(url=redirect_to, host=request.get_host()):

                redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)



            # Okay, security check complete. Log the user in.

            auth_login(request, form.get_user())



            return HttpResponseRedirect(redirect_to)

    else:

        form = authentication_form(request)



    current_site = get_current_site(request)



    context = {

        'form': form,

        redirect_field_name: redirect_to,

        'site': current_site,

        'site_name': current_site.name,

    }

    if extra_context is not None:

        context.update(extra_context)

    return TemplateResponse(request, template_name, context,

                            current_app=current_app)


URL name: login
매개변수:
template_name: 기본 로그인 템플릿입니다.기본값은 registration/login입니다.html.redirect_field_name: 기본값은next입니다.authentication_form: 기본 Form.Defaults to AuthenticationForm.current_app: A hint indicating which application contains the current view. See the namespaced URL resolution strategy for more information.extra_context: 기본 context 데이터에 추가된 데이터는 사전입니다.
django.contrib.auth.views.login does:
GET를 통해 액세스할 경우 컨텐트를 같은 URL에 POST로 표시할 수 있는 로그인 양식이 표시됩니다.POST를 통해 접근하면 먼저 로그인을 시도하고, 성공하면view는next에서 지정한 링크로 바꿉니다.next가 설정되지 않으면 settings로 다시 지정합니다.LOGIN_REDIRECT_URL(일반적으로 기본값은 accounts/profile/)입니다.로그인에 실패하면 로그인 폼을 다시 표시합니다.
사용자 스스로login의 html 템플릿을 제공해야 합니다. 부족한 것은registration/login입니다.html .이 템플릿은 4개의 템플릿 컨텍스트 변수를 전달합니다.
form: 양식 객체 AuthenticationForm.next: 로그인에 성공한 후 방향을 바꾸는 링크입니다.query string을 포함할 수 있습니다.site: 현재 웹 사이트, SITEID 설정.만약 site 프레임워크를 설치하지 않았다면, 이 변수는 현재 Http Request에서 사이트 이름과 도메인 이름을 얻을 수 있는 Request Site 실례로 설정됩니다.site_name:site입니다.name의 별명만약 site 프레임워크를 설치하지 않았다면, 그것은 Request로 설정될 것입니다.META['SERVER NAME']의 값입니다.
registration/login을 호출하고 싶지 않으면.html 템플릿, URLconf에 특정view 파라미터를 설정하여templatename 매개 변수.
(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html'}),

링크 필드 이름을 직접 지정할 수 있습니다.redirectfield_name 매개 변수.기본 필드 이름은next입니다.
다음은registration/login입니다.html 템플릿의 원시 상태, 베이스가 있다고 가정합니다.html 템플릿
{% extends "base.html" %}



{% block content %}



{% if form.errors %}

<p>Your username and password didn't match. Please try again.</p>

{% endif %}



<form method="post" action="{% url 'django.contrib.auth.views.login' %}">

{% csrf_token %}

<table>

<tr>

    <td>{{ form.username.label_tag }}</td>

    <td>{{ form.username }}</td>

</tr>

<tr>

    <td>{{ form.password.label_tag }}</td>

    <td>{{ form.password }}</td>

</tr>

</table>



<input type="submit" value="login" />

<input type="hidden" name="next" value="{{ next }}" />

</form>



{% endblock %}

스스로 인증 시스템을 사용자 정의하면 authenticationform 매개 변수는 사용자 정의 인증 폼을login view에 전송합니다.양식의init__ 방법은 Request의 매개 변수가 있어야 하고 get 를 제공해야 한다사용자 메서드는 인증된 User 객체를 반환합니다.
logout(request[, next_page, template_name, redirect_field_name, current_app,extra_context])
사용자를 로그아웃합니다.
URL name: logout
옵션 매개변수:
next_페이지:로그아웃 후 링크 리셋.
logout_then_login(request[, login_url, current_app, extra_context])
사용자를 로그아웃하고 로그인 링크로 다시 지정합니다.
옵션 매개변수:
login_url: 로그인 페이지의 리셋 링크입니다. 부족한 값은settings입니다.LOGIN_URL.
password_change(request[, template_name, post_change_redirect,password_change_form,current_app, extra_context])
사용자가 암호를 수정할 수 있도록 허용합니다.
URL name: password_change
옵션 매개변수 Optional arguments:
template_name: 템플릿 이름, 기본값은registration/passwordchange_form.html .post_change_redirect: 링크를 다시 지정합니다.password_change_form: 사용자 정의 암호 수정 폼,user 매개 변수를 포함합니다.기본값은 PasswordChangeForm입니다.
password_change_done(request[, template_name,current_app, extra_context])
사용자가 비밀번호를 수정한 페이지입니다.
URL name: password_change_done
옵션 매개변수 Optional arguments:
template_name: 템플릿 이름, 기본값은registration/passwordchange_done.html.
password_reset(request[, is_admin_site, template_name, email_template_name, password_reset_form, token_generator, post_reset_redirect, from_email, current_app, extra_context, html_email_template_name])
사용자에게 비밀번호를 재설정할 수 있는 일회용 링크를 포함하는 메일을 보냅니다.
제공된 메일박스가 존재하지 않으면 발송되지 않습니다.
URL name: password_reset
옵션 매개변수 Optional arguments:
template_name: 템플릿 이름, 기본값은registration/passwordreset_form.html.email_template_name: 충전 링크가 있는 이메일을 생성하는 템플릿 이름입니다. 기본값은registration/passwordreset_email.html.subject_template_name: 메일 테마를 생성하는 템플릿 이름입니다. 기본값은registration/passwordreset_subject.txt.password_reset_form: 암호의 양식을 재설정합니다. 기본값은 PasswordResetForm입니다.
token_generator: 일회성 링크의 클래스 실례를 검사합니다. 기본값은default 입니다.token_generator, 그 종류는django입니다.contrib.auth.tokens.PasswordResetTokenGenerator.
post_reset_redirect: 비밀번호가 재설정된 링크입니다.
from_email: 메일 주소, 기본값은 DEFAULTFROM_EMAIL.
current_app: A hint indicating which application contains the current view. See the namespaced URL resolution strategy for more information.extra_context: A dictionary of context data that will be added to the default context data passed to the template.html_email_template_name: The full name of a template to use for generating a text/html multipart email with the password reset link. By default, HTML email is not sent.
예: registration/passwordreset_email.html(email 컨텐츠 템플릿):
Someone asked for password reset for email {{ email }}. Follow the link below:

{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}

password_reset_done(request[, template_name])
사용자가 비밀번호를 선택해서 메일을 리셋한 페이지를 표시합니다.passwordreset()view에 명시적 post 지정이 없습니다.reset_redirect 링크 시 이view를 직접 호출합니다.
password_reset_confirm(request[, uidb36, token, template_name, token_generator,set_password_form, post_reset_redirect,current_app, extra_context])
새 암호를 입력한 양식을 표시합니다.
password_reset_complete(request[, template_name, current_app, extra_context])
비밀번호를 초기화한 폼입니다.
Helper functions
redirect_to_login(next[, login_url, redirect_field_name])
로그인 페이지로 리디렉션합니다. 로그인에 성공한 후 다른 링크로 리디렉션합니다.
매개변수:
next: 로그인에 성공한 링크입니다.
login_url: 로그인 페이지 링크, 기본 절약값:settings.LOGIN_URL.
redirect_field_name: 필드 이름을 다시 지정합니다. 절약값은next입니다.
내장 양식Built-in forms
class AdminPasswordChangeForm
admin 백그라운드 사용자 비밀번호 수정 폼
class AuthenticationForm
로그인 양식.
메서드 confirmlogin_allowed(user)
예를 들어 is 를 막론하고 모든 users 로그인을 허용합니다active 속성:
from django.contrib.auth.forms import AuthenticationForm



class AuthenticationFormWithInactiveUsersOkay(AuthenticationForm):

    def confirm_login_allowed(self, user):

        pass

또는 활성 사용자만 로그인 가능:
class PickyAuthenticationForm(AuthenticationForm):

    def confirm_login_allowed(self, user):

        if not user.is_active:

            raise forms.ValidationError(

                _("This account is inactive."),

                code='inactive',

            )

        if user.username.startswith('b'):

            raise forms.ValidationError(

                _("Sorry, accounts starting with 'b' aren't welcome here."),

                code='no_b_users',

            )


class PasswordChangeForm
암호 양식을 수정합니다.
class PasswordResetForm
암호 재설정 양식.
class SetPasswordForm
암호 설정 양식.
class UserChangeForm
관리자 백엔드의 사용자 정보와 권한 수정 폼입니다.
class UserCreationForm
사용자가 양식을 작성합니다.
템플릿의 인증 정보 Authentication data in templates
현재 로그인한 사용자와 해당 권한은 RequestContext를 사용하여 템플릿 변수에서 사용할 수 있습니다.
Users가 템플릿 RequestContext를 렌더링할 때 현재 로그인한 사용자는 User 인스턴스든 AnonymousUser 인스턴스든 템플릿 변수 {{{{{{user}}에 저장됩니다.
{% if user.is_authenticated %}

    <p>Welcome, {{ user.username }}. Thanks for logging in.</p>

{% else %}

    <p>Welcome, new user. Please log in.</p>

{% endif %}

RequestContext를 사용하지 않으면 이 변수가 존재하지 않습니다.
RequestContext 사용:
from django.shortcuts import render_to_response

from django.template import RequestContext



def some_view(request):

    # ...

    return render_to_response('my_template.html',

                              my_data_dictionary,

                              context_instance=RequestContext(request))


  

좋은 웹페이지 즐겨찾기