>  기사  >  백엔드 개발  >  Django 사용자 인증 시스템 (2) 웹 요청에서의 인증

Django 사용자 인증 시스템 (2) 웹 요청에서의 인증

黄舟
黄舟원래의
2016-12-23 17:42:121448검색

모든 웹 요청에 request.user 속성을 제공하여 현재 사용자를 나타냅니다. 현재 사용자가 로그인되어 있지 않으면 이 속성은 AnonymousUser의 인스턴스이고, 그렇지 않으면 User 인스턴스입니다.

is_authenticated()로 구별할 수 있습니다. 예:

if request.user.is_authenticated():
# 인증된 사용자를 위해 작업을 수행합니다.
else:
# 익명 사용자를 위해 뭔가를 하세요.

로그인 로그인

login()

로그인 함수에는 HttPRequest 객체와 User 객체가 매개변수로 필요합니다. login()은 Django의 세션 프레임워크를 사용하여 세션에 사용자 ID를 저장합니다.

authentic()과 login()을 동시에 사용:

from django.contrib.auth import authenticate, login

def my_view(request):
사용자 이름 = 요청 .POST['사용자 이름']
passWord = request.POST['비밀번호']
사용자 = authenticate(사용자 이름=사용자 이름, 비밀번호=비밀번호)
사용자가 없음이 아닌 경우:
if user.is_active:
          login(request, user)
              # '잘못된 로그인' 오류 메시지를 반환합니다.


로그아웃 로그아웃

logout()

HttpRequest 객체를 매개변수로 사용하며 반환값이 없습니다. 예:

from django.contrib.auth import logout

def logout_view(request):

logout(request)

# 성공 페이지로 리디렉션합니다.


액세스 제한

원시 방식

request.user.is_authenticated() 사용

리디렉션:

from django.shortcuts 가져오기 리디렉션

def my_view(request):

그렇지 않은 경우 request.user.is_authenticated():

return 리디렉션('/login/?next=%s' % request.path)
# ...


또는:

from django.shortcuts import render

def my_view(request):

request.user.is_authenticated()가 아닌 경우 :

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


데코레이터 사용 login_required

login_required([redirect_field_name=REDIRECT_FIELD_NAME, login_url=없음]

from django.contrib.auth.designators import login_required

@login_required

def my_view(request):

...


사용자가 로그인되어 있지 않은 경우 settings.LOGIN_URL로 리디렉션하고 현재 URL의 상대 경로를 추가하여 쿼리 문자 쌍을 키로 형성하고 이를 settings.LOGIN_URL:

/accounts에 추가합니다. /login/ ?next=/polls/3/.

쿼리 문자 쌍의 키는 기본적으로 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.designators 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):

request.user에서 '@example.com'이 아닌 경우 .email:

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

# ...



장식자를 사용할 수 있습니다:

from django .contrib.auth.designators import user_passes_test

def email_check(user):

return '@example.com' in user.email


@user_passes_test(email_check)
def my_view (요청):
...


인증 뷰

물론 로그인, 로그아웃, 비밀번호 관리를 위한 일부 뷰 기능을 직접 정의할 수 있습니다. 더 편리합니다.

하지만 Django의 내장 뷰에 대해서도 배울 수 있습니다.

Django는 인증 보기에 대한 기본 템플릿을 제공하지 않지만 템플릿 컨텍스트는 아래의 각 보기에 대해 문서화되어 있습니다.

모든 내장 보기는 TemplateResponse 인스턴스를 반환하므로 응답 데이터.

https://github.com/django/django/blob/master/django/contrib/auth/views.py

대부분의 내장 인증 뷰는 다음에 대한 URL 이름을 제공합니다. 사용.

로그인(요청[, 템플릿_이름, 리디렉션_필드_이름, 인증_양식,현재_앱,추가_컨텍스트])

소스 코드:

def login(request, template_name='registration/login.html',
         redirect_field_name=REDIRECT_FIELD_NAME,
         authentication_form=AuthenticationForm,
         current_app=None, extra_context=None):
   """
   로그인 양식을 표시하고 로그인 작업을 처리합니다.
   """
   redirect_to = request.POST.get(redirect_field_name,
                                  request.GET.get(redirect_field_name, ''))

   if request.method == "POST":
       form = 인증_form(request, data=request.POST)
       if form.is_valid():

           # 사용자 원본을 확인하세요. 리디렉션 URL은 안전합니다.
           그렇지 않은 경우 is_safe_url(url=redirect_to,host=request.get_host()):
               redirect_to = 해결_url(settings.LOGIN_REDIRECT_URL)

           # 보안 좋습니다. 확인 완료. 사용자를 로그인합니다.
           auth_login(request, form.get_user())

           return HttpResponseRedirect(redirect_to)
   else:
       form = authenticate_form(request)

   현재_사이트 = get_current_site (request) context = { 'form': form,
redirect_field_name : redirect_to, 'site_name': current_site.name,
   }
   extra_context가 None이 아닌 경우:
       context.update(extra_context)
   return TemplateResponse(request, template_name, context,
                           current_app=current_app)


URL 이름: 로그인

参数:

template_name: 默认的登陆模板.默认为registration/login.html.

redirect_field_name: 重向的name,默认为next.

인증_양식: 양식입니다. 기본값은 AuthenticationForm입니다.

current_app: 현재 보기가 포함된 애플리케이션을 나타내는 힌트입니다. 자세한 내용은 네임스페이스된 URL 확인 전략을 참조하세요.

extra_context: 添加到默认context data中的额外数据,为字典。


django.contrib.auth.views.login does:

如果通过GET访问, 将显示登录表单, 可以将其内容POST到到同的URL上.
如果通过POST访问, 它首先会尝试登录, 이제 다음 단계의 확정을 확인하세요.如果next 未设置,则重定向到settings.LOGIN_REDIRECT_URL(一般缺省值为accounts/profile/)。如果登录失败,则再次显示登录表单。

需要用户自己来提供로그인 html模板,缺省是registration/login.html 。这个模板将传递4个模板上下文变weight:

양식: 一个表单对象AuthenticationForm.
다음: 登录成功对象AuthenticationForm.

链接,可以包含一个 쿼리 문자열中。

사이트: 当前网站,根据 SITE_ID 设置。如果你并没有安装site框架,这个变weight将设定为一个 RequestSite实例,它从当前 HttpRequest取得站点name과 域name。

site_name: 是 사이트. 이름이 一个别name입니다.如果你没가 있는 사이트는 它将会被设为 request.META['SERVER_NAME']적입니다.


如果你不想调用registration/login.html模板,你可URLconf에 있습니다.中设정의 특정 보기参数来传递template_name参数。

(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login .html '}), 你 你 也 可以 可以 自己 自己 指定 重定 重定 向 链接 字段名 字段名 通过 通过 redirect_field_name 参数。。 默认 默认 的 字段 名 为 为 为

{%는 "base.html"을 확장합니다 %}

{% 블록 콘텐츠 %}

{% if form.errors %}

사용자 이름 및 비밀번호 일치하지 않습니다. 다시 시도해 주세요.


{% endif %}


{% csrf_token %}








{{ form.username.label_tag }} {{ form.username }}
{{ form.password.label_tag } } {{ form.password }}






{% endblock %}

인증 시스템을 맞춤설정하는 경우 인증_양식 매개변수를 통해 맞춤 인증 양식을 로그인 보기에 전달할 수 있습니다. 양식의 __init__ 메소드에는 요청 매개변수가 있어야 하며 인증된 User 객체를 반환하기 위한 get_user 메소드를 제공해야 합니다.

로그아웃(요청[, next_page, template_name,redirect_field_name, current_app,extra_context])

사용자를 로그아웃합니다.

URL 이름: logout

선택 매개변수 :

next_page: 로그아웃 후 링크 리디렉션.

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 이름: 비밀번호 변경

예 선택 인수:

template_name: 템플릿 이름, 기본값은 Registration/password_change_form.html입니다.
post_change_redirect: 링크를 리디렉션합니다.
password_change_form: 사용자 매개변수를 포함한 맞춤형 비밀번호 변경 양식. 기본값은 PasswordChangeForm입니다.

password_change_done(request[, template_name,current_app, extra_context])

사용자가 비밀번호를 변경한 후의 페이지입니다.

URL 이름:password_change_done

선택 인수:

template_name: 템플릿 이름, 기본값은 등록/password_change_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 이름: 비밀번호 재설정

선택 인수 선택 인수:

template_name: 템플릿 이름, 기본값은 Registration/password_reset_form.html입니다.
email_template_name: 재충전 링크가 포함된 이메일을 생성하는 데 사용되는 템플릿 이름입니다. 기본값은 Registration/password_reset_email.html입니다.
subject_template_name: 이메일 제목을 생성하는 데 사용되는 템플릿의 이름입니다. 기본값은 Registration/password_reset_subject.txt입니다.
password_reset_form: 비밀번호 재설정 양식, 기본값은 PasswordResetForm입니다.

token_generator: 일회성 링크의 클래스 인스턴스를 확인합니다. 기본값은 default_token_generator, 해당 클래스는 django.contrib.auth.tokens입니다. PasswordResetTokenGenerator.

post_reset_redirect: 비밀번호 재설정 후 링크를 ​​리디렉션합니다.

from_email: 이메일 주소, 기본값은 DEFAULT_FROM_EMAIL입니다.

current_app: 어떤 애플리케이션에 포함되어 있는지 나타내는 힌트 자세한 내용은 네임스페이스 URL 확인 전략을 참조하세요.
extra_context: 템플릿에 전달되는 기본 컨텍스트 데이터에 추가될 컨텍스트 데이터 사전.
html_email_template_name: 템플릿의 전체 이름 비밀번호 재설정 링크가 포함된 text/html 멀티파트 이메일을 생성하는 데 사용합니다. 기본적으로 HTML 이메일은 전송되지 않습니다.

예: Registration/password_reset_email.html(이메일 콘텐츠 템플릿):

누군가 이메일 {{ email }}에 대한 비밀번호 재설정을 요청했습니다. 아래 링크를 따르세요:
{{ 프로토콜}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}

password_reset_done(request[, template_name])

사용자가 비밀번호 재설정 이메일을 보내기로 선택한 후 페이지를 표시합니다. post_reset_redirect 링크가 Password_reset() 뷰에 명시적으로 지정되지 않은 경우 이 뷰가 직접 호출됩니다.

password_reset_confirm(request[, uidb36, token, template_name, token_generator,set_password_form, post_reset_redirect,current_app, extra_context])

새 비밀번호 입력 양식을 표시합니다.

password_reset_complete (요청 [, template_name, current_app, extra_context])

비밀번호 재설정 성공 후의 양식입니다.

도우미 기능

redirect_to_login(next[, login_url,redirect_field_name])

로그인 페이지로 리디렉션한 후 다른 링크로 리디렉션하세요. .

매개변수:

다음: 로그인 성공 후 링크.

login_url: 로그인 페이지 링크, 기본값: settings.LOGIN_URL.

redirect_field_name: 필드 이름을 리디렉션합니다. 기본값은 다음입니다.

내장 양식

class AdminPasswordChangeForm

관리자 백그라운드 사용자 비밀번호 변경 양식

class AuthenticationForm

로그인 양식.

confirm_login_allowed(user) 메소드

예를 들어 is_active 속성에 관계없이 모든 사용자가 로그인하도록 허용합니다:

from django.contrib.auth.forms import AuthenticationForm

class AuthenticationFormWithInactiveUsersOkay(AuthenticationForm):
def verify_login_allowed(self, user):
pass

또는 활성 사용자만 로그인하도록 허용:

class PickyAuthenticationForm(AuthenticationForm):
def verify_login_allowed(self, user):
if not user.is_active:
raise form.ValidationError(
) _("이 계정은 비활성 상태입니다."),
code='inactive' ,
          )
          if user.username.startswith('b'):
                                                                                                 ' s                     ~ ~         ‐ off   ‐ ‐ ‐ ("죄송합니다. 'b'로 시작하는 계정은 여기 오신 것을 환영하지 않습니다.")
🎜>비밀번호 재설정 양식.

class SetPasswordForm

비밀번호 설정 양식.

class UserChangeForm

관리 배경 사용자 정보 및 권한 수정 양식.

class UserCreationForm

사용자 생성 양식

템플릿의 인증 정보

현재 로그인된 사용자 및 해당 권한은 RequestContext를 사용하여 템플릿 변수에서 가져옵니다.

Users

템플릿 RequestContext를 렌더링할 때 User 인스턴스이든 AnonymousUser 인스턴스이든 현재 로그인된 사용자가 템플릿에 저장됩니다. 변수 {{ user }}:

{% if user .is_authenticated %}

환영합니다, {{ user.username }}님, 로그인해 주셔서 감사합니다.

{% else %}

신규 사용자님, 환영합니다. 로그인해 주세요.

{% 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',

                                                                                       >                                               )

 

위는 Django 사용자 인증 시스템입니다. (2) 웹 요청의 인증 내용에 대한 자세한 내용은 다음과 같습니다. 내용은 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!




성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.