사용자 인증 : 장고 전투 1 권한 관리는 -03 기능

한 권한 관리 모델 설계

1.1 만들기 응용 프로그램

새로운 응용 프로그램을 작성, 시스템 이름은 사용자 관리, 메뉴 관리 및 권한 관리 시스템 및 기타 기반 모듈을 포함했다.

  • 팝업 창 입력 앱에 새로운 → 파이썬 패키지를 선택, 우리의 프로젝트를 마우스 오른쪽 루트 프로젝트 디렉토리를 열 pycharm 사용, 패킷이 프로젝트에 생성 된 모든 응용 프로그램을 저장하는 데 사용됩니다.
  • , pycharm 상단 도구를 선택하고 실행을 클릭 manage.py 작업 ..., 이것은 다음과 같이의 startApp 시스템은 응용 프로그램을 작성하십시오 입력, 바닥 pycharm에서 창을 열 것입니다 :

  • 시스템은 아래에 만든 응용 프로그램으로 이동합니다
  • 우리의 새로운 응용 프로그램을 마우스 오른쪽 응용 프로그램에 대한 액세스를 원활하게하기 위해, → 소스 루트로 표시 디렉토리를 선택
  • sandboxMP / sandboxMP / settings.py 다음과 같은 추가 수정 :
import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps')) 

1.2 인증 기관의 모델을 만들 수 있습니다

사용자 지정 권한 인증 모델, 모델 설명을 사용하여 sandboxMP 프로젝트 :

Menu: 菜单管理,用来存储系统可用的URL
Role: 角色组,通过外键关联Menu,角色组中的用户将继承Role关联菜单的访问权限 Structure:组织架构,包含单位和部门信息 UserProfile自定义用户认证模型,替换系统原有的User模型 

모델은 다음과 애플리케이션 / 시스템 / models.py에 복사, 인증 기관의 콘텐츠 아래에 자세히 설명되어 있습니다

from django.db import models
from django.contrib.auth.models import AbstractUser


class Menu(models.Model): """ 菜单 """ name = models.CharField(max_length=30, unique=True, verbose_name="菜单名") # unique=True, 这个字段在表中必须有唯一值. parent = models.ForeignKey("self", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="父菜单") icon = models.CharField(max_length=50, null=True, blank=True, verbose_name="图标") code = models.CharField(max_length=50, null=True, blank=True, verbose_name="编码") url = models.CharField(max_length=128, unique=True, null=True, blank=True) def __str__(self): return self.name class Meta: verbose_name = '菜单' verbose_name_plural = verbose_name  @classmethod def get_menu_by_request_url(cls, url): return dict(menu=Menu.objects.get(url=url)) class Role(models.Model): """ 角色:用于权限绑定 """ name = models.CharField(max_length=32, unique=True, verbose_name="角色") permissions = models.ManyToManyField("menu", blank=True, verbose_name="URL授权") desc = models.CharField(max_length=50, blank=True, null=True, verbose_name="描述") class Structure(models.Model): """ 组织架构 """ type_choices = (("unit", "单位"), ("department", "部门")) name = models.CharField(max_length=60, verbose_name="名称") type = models.CharField(max_length=20, choices=type_choices, default="department", verbose_name="类型") parent = models.ForeignKey("self", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="父类架构") class Meta: verbose_name = "组织架构" verbose_name_plural = verbose_name def __str__(self): return self.name class UserProfile(AbstractUser): name = models.CharField(max_length=20, default="", verbose_name="姓名") birthday = models.DateField(null=True, blank=True, verbose_name="出生日期") gender = models.CharField(max_length=10, choices=(("male", "男"), ("female", "女")), default="male", verbose_name="性别") mobile = models.CharField(max_length=11, default="", verbose_name="手机号码") email = models.EmailField(max_length=50, verbose_name="邮箱") image = models.ImageField(upload_to="image/%Y/%m", default="image/default.jpg", max_length=100, null=True, blank=True) department = models.ForeignKey("Structure", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="部门") post = models.CharField(max_length=50, null=True, blank=True, verbose_name="职位") superior = models.ForeignKey("self", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="上级主管") roles = models.ManyToManyField("role", verbose_name="角色", blank=True) class Meta: verbose_name = "用户信息" verbose_name_plural = verbose_name ordering = ['id'] def __str__(self): return self.name 

1.3 사용 모델

모델이 정의 된 후,뿐만 아니라 우리가 INSTALLED_APPS에 위치한 models.py에서 응용 프로그램의 이름을 추가, settings.py 파일을 수정해야,이 모델을 사용하는 장고에게 :

INSTALLED_APPS = [
     ...原内容省略...
     'system',
]

또한 당신이 setting.py에 다음과 같은 내용을 추가해야 자기 인증 USERPROFILE 모델 정의에 사용할 :

AUTH_USER_MODEL = 'system.UserProfile'

참고 :
, 베개, CMD 창을 열어 프로젝트의 파이썬 가상 환경을 입력 한 다음 베개를 설치 : 수행 makemigrations가 종속성을 설치해야하기 전에 사용자 정의 모델, 필드 유형을 ImageField 시간은 사용

C:\Users\RobbieHan>workon sandboxMP
(sandboxMP) C:\Users\RobbieHan>pip install pillow

베개를 설치 PIP : 터미널 터미널 창 pycharm을 설치하기 위해 실행할 수있다

마지막 실행 makemigrations하고, pycharm 도구를 사용하여 테이블을 작성 마이그레이션 실행을 클릭 manage.py를 작업은 ... 다음 명령 manage.py 창을 입력 :

makemigrations
migrate

1.4 모델 (모델) 관련 지식

필드 유형 :

다음과 같은 인증 기관은 모델 필드 유형에서 사용하는 :

CharField: 用来存储字符串,必须制定一个参数 max_length用来限定字段最大长度
Foreignkey是一个关联字段,创建多表之间的多对一关系,如果创建同表之间的递归关联关系,可以使用models.ForeignKey('self') ManyToManyField: 用来实现多对多的关联关系 DateField日期时间字段 EmailField: email字段,用来检查email地址是否合法 ImageField图片字段,用来定义图片上传和图片检查,需要安装pillow

필드 옵션 :

unique: 设置为True, 则表示这个字段必须有唯一值,这是从数据库级别来强制数据唯一,后面我们还会介绍通过form验证来确保数据输入的唯一
verbose_name:
blank: 默认值是False, 设置为True,则该字段允许为空 null: 默认值是False,如果为True,Django会在数据库中将空值转存为NULL choices: 是一个可迭代结构(元祖),每个元组中的第一个元素,是存储在数据库中的值;第二个元素是使人容易理解的描述。 

on_delete : 주어진 필드와 관련된 django2.0 이전 버전, on_delete 옵션이 필요하지 않습니다, 당신은 관련 분야 on_delete를 정의 할 때 django2.0 버전 이후에 다음과 같이 일반적으로 사용되는 매개 변수는 정의 할 필요가있는 경우 :

on_delete=models.CASCADE,     # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING,  # 删除关联数据,什么也不做 on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError on_delete=models.SET_NULL, # 删除关联数据,与之关联的值设置为null on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值 

SET_NULL를 사용할 때 모델이 예를 들어, 비어있을 수 있습니다 설정해야하는 경우이 필드는 정의합니다 :

user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True) 

SET_DEFAULT를 사용하는 경우 또한, 우리는 할 미리 정의 된 기본이 필요합니다 :

user = models.ForeignKey(User, on_delete=models.SET_DEFAULT, default='默认值')

: 필드 유형과 필드 옵션 더, 참조하시기 바랍니다
https://docs.djangoproject.com/en/1.11/ref/models/fields/#model-field-types

이 개 사용자 인증과 액세스 제한

다음과 같이 사용자 로그인 인증 요구 사항은 다음과 같습니다

  • 사용자 로그인 시스템은 특정 페이지에 액세스 할 수 있습니다
  • 사용자가 로그인하지 않은 경우 직접 로그인 화면으로 이동합니다 액세스하려면,
  • 사용자가에서 점프 착륙 완료 한 후 로그인을 화면에 자동으로 점프하기 전에 액세스 주소를 액세스,
  • 사용자는 사용자 이름, 전화 번호 또는 사용자 이름과 같은 다른 필드를 사용할 수 있습니다.

방금 만든 페이지에서 필요한 모듈을 가져 views_user : pycharm에서 마우스 오른쪽 단추로 클릭하고 새 → 파이썬 파일을 선택 팝업 창에 이름을 입력 sandboxMP / 응용 프로그램 / 시스템을 선택합니다 :

from django.shortcuts import render
from django.views.generic.base import View from django.http import HttpResponseRedirect from django.contrib.auth import authenticate, login, logout from django.urls import reverse 

설명 : 생성 다음보기는 sandboxMP / 응용 프로그램 / 시스템 / views_user.py 파일에 기록된다

2.1 인덱스 페이지 뷰 만들기

인덱스 페이지 뷰, 뷰이 만든 첫 번째 프로젝트는 다음과 같습니다

class IndexView(View):

    def get(self, request): return render(request, 'index.html') 

지식 소개 :

1,보기 : 장고 공식 문서는 "보기"에 대한 설명은 로직 처리 사용자 요청을 포장하고 응답을 반환하는 데 사용됩니다.
우리는 웹 웹 요청을 수락하고 응답을 반환하는보기 기능을 정의 할 수 있습니다, 당신은보기에 따라 클래스를 만드는 프로젝트의 구현의 객체 기반 뷰 클래스 뷰되어 사용하고, 기능 기반의 뷰에 비해 상당히 다른에 따라 수 및 장점 :

  • 당신은 HTTP 방법 조건부 분기를 판단 할 필요없이, 별도의 방법으로 HTTP 메소드 (GET, POST 등)와 관련된 코드를 작성할 수 있습니다
  • 코드는 재사용 가능한 구성 요소로 분해 될 수있다, 예를 들어, 믹스 인 (다중 상속)는, 플레이 객체 지향 기술은보다 유연하고 쉽게 확장

2는 함수 렌더링 주어진 컨텍스트 사전과 주어진 템플릿을 결합 후 장고의 단축키 기능 HttpRespose 대상 및 표현 구문을 반환 (렌더링 요청 TEMPLATE_NAME 문맥 = 없음, CONTENT_TYPE = 없음, 상태 = 없음 = 없음), 상기 요청 파라미터 TEMPLATE_NAME해야를 사용하지 다른 파라미터는 선택하지 않는다.

2.2 사용자 로그인보기 만들기

다음과 같이 사용자 로그인보기를 작성하기 전에, 먼저 사용자 로그인을 확인하기 위해 입력으로 사용되는 sandboxMP / 응용 프로그램 / 시스템 / forms.py 파일을 만듭니다

from django import forms


class LoginForm(forms.Form):
    username = forms.CharField(required=True, error_messages={"requeired": "请填写用户名"}) password = forms.CharField(required=True, error_messages={"requeired": "请填写密码"}) 

사용자 로그인보기를 만듭니다

from .forms import LoginForm


class LoginView(View): def get(self, request): if not request.user.is_authenticated: return render(request, 'system/users/login.html') else: return HttpResponseRedirect('/') def post(self, request): redirect_to = request.GET.get('next', '/') login_form = LoginForm(request.POST) ret = dict(login_form=login_form) if login_form.is_valid(): user_name = request.POST['username'] pass_word = request.POST['password'] user = authenticate(username=user_name, password=pass_word) if user is not None: if user.is_active: login(request, user) return HttpResponseRedirect(redirect_to) else: ret['msg'] = '用户未激活!' else: ret['msg'] = '用户名或密码错误!' else: ret['msg'] = '用户和密码不能为空!' return render(request, 'system/users/login.html', ret) 

지식 소개 :
장고 요청 개체 인증 시스템을 차단하는 세션과 미들웨어를 사용합니다. 그들은 현재 사용자를 대표하는 각 요청에 request.user 속성을 제공합니다. 현재 사용자가 로그인하지 않은 경우 속성이 그렇지 않으면 사용자 인스턴스 될 것 AnonymousUser의 인스턴스로 설정됩니다.
1, request.user.is_authenticated : 결정하는데 사용 LoginView 예에서와 같이 사용자의 로그인 여부 :

 # 当用户访问登陆页面时,判断用户如果未登入则访问登陆页面,如果登入则跳转到首页
if not request.user.is_authenticated:
    return render(request, 'system/users/login.html') else: return HttpResponseRedirect('/') 

2 is_valid () : 폼 cleaned_data 속성에 데이터를 기억하면서, 입력 방법은, 그것이 true를 반환 할 때 방법은 현장 확인을 위해 사용되는 필드의 값을 예를 형성한다.
(3), (요청 = 없음, 인증한다 ** 자격 증명) : 검사의 후단가 인증을 통과하면 사용자, 키워드 자격 증명 매개 변수의 기본 사용자 이름과 암호를 인증하는 데 사용은 사용자의 객체가 돌려 주어집니다.
4 로그인 (요청 사용자, 백엔드 = 없음) 의 사용자 ID가 세션 테이블에 저장하면서, 뷰에서 사용자를 기록하는 데 사용. 참고 : 로그인 () 인증합니다 () 사용자를 성공적으로 인증을 호출하기 전에 사용해야합니다.
5, HttpResponseRedirect를 [소스] : 액세스 매개 변수 주소를 리디렉션 리디렉션 전체 URL이 될 수도 프로젝트에 읽을 수있는 절대 경로와 함께하고 싶었다.

2.3 사용자가 로그인보기 만들기

class LogoutView(View):

    def get(self, request): logout(request) return HttpResponseRedirect(reverse('login')) 

지식 소개 :
1, 짐바브웨 로그 아웃 (요청) : 사용자가 로그 아웃.
2, (view 이름을) 역 : URL이 URL을 이름에 따라 해결 반전.

2.4 사용자 URL 라우팅 구성

뷰 URL을 통해 응용 프로그램에 액세스하려면, 또한 당신은 sandboxMP / sandboxMP / urls.py를 수정, URL 라우팅을 구성해야합니다 :

from django.contrib import admin
from django.urls import path from system.views_user import IndexView, LoginView, LogoutView urlpatterns = [ path('admin/', admin.site.urls), path('', IndexView.as_view(), name='index'), path('login/', LoginView.as_view(), name='login'), path('logout/', LogoutView.as_view(), name='logout'), ] 

2.5 사용자 인증 만들기

pycharm 선택 도구에서 실행을 클릭 manage.py 다음과 같이 작업 ... 열리는 창에서 createsuperuser를 입력, 사용자 이름, 이메일과 비밀번호를 입력 프롬프트에 따라, 동작은 다음과 같습니다

manage.py@sandboxMP > createsuperuser
"C:\Program Files\JetBrains\PyCharm2017.3.2\bin\runnerw.exe" C:\Users\RobbieHan\Envs\sandboxMP\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm2017.3.2\helpers\pycharm\django_manage.py" createsuperuser D:/ProjectFile/sandboxMP 用户名: admin 邮箱: [email protected] Warning: Password input may be echoed. Password: !qaz@wsx Warning: Password input may be echoed. Password (again): !qaz@wsx Superuser created successfully. 

시스템에 액세스 프로젝트를 실행 : http://127.0.0.1:8000을 , 우리는 사용자가 직접 홈 페이지에 액세스 할 수 있습니다, 로그인하지 않고, 우리의 요구 사항과 일치하지 않습니다. 액세스 제한을 구현 다음 페이지는 요구 사항에 액세스 할 수있는 사용자로 로그인해야합니다.

2.6 페이지 뷰 제한

페이지 액세스 제한 구현 요구 사항 :

  • 사용자 로그인 시스템은 특정 페이지에 액세스 할 수 있습니다
  • 사용자는 직접으로 이동합니다 로그인 화면에 액세스하려면 로그인되어 있지 않은 경우
  • 점프 방문 페이지를 방문 완료 후 사용자 전에 자동으로 주소를 액세스를 액세스하기 위해 점프

새로운 sandboxMP은 / 애플 리케이션 / 시스템 / mixin.py 다음을 쓰기 :

from django.contrib.auth.decorators import login_required


class LoginRequiredMixin(object):
    @classmethod
    def as_view(cls, **init_kwargs): view = super(LoginRequiredMixin, cls).as_view(**init_kwargs) return login_required(view) 

sandboxMP / sandboxMP / settings.py 추가 LOGIN_URL 수정

LOGIN_URL = '/login/'

사용자가보기에 액세스하려면 로그인해야합니다, 당신은 단지 다음과 같이 개정 LoginRequiredMixin, IndexView보기를 상속해야합니다

from .mixin import LoginRequiredMixin

class IndexView(LoginRequiredMixin, View): def get(self, request): return render(request, 'index.html') 

참고 : 위치 왼쪽 LoginRequiredMixin 위치 상속 목록을

http://127.0.0.1:8000를 입력, 우리는 다시 홈 페이지를 방문, 프로젝트를 다시 시작 브라우저를 열고, 우리는 브라우저의 URL이 될 것이라는 점을 것을을 발견 할 것이다 : http://127.0.0.1:8000/login/ ? 다음 = /, 우리가 먼저 홈 페이지로 이동합니다 로그인해야 후.
2.5 절에서 만든 우리의 사용자가 사용하여 관리자에게 암호 :! QAZ wsx에 착륙 시스템 @

2.7 액세스 미디어 파일

기본 화면 설정 만 사용자를 생성하고, 사용되는 기본 아바타 이미지를 배치했지만,이 미디어 파일에 액세스하도록 구성 할 필요가 있도록 사용자가 사진을 기록 후 계속 표시 할 수없는 경우.

미디어 파일이 사용자 파일 업로드되는 경로는 사용자의 아바타 업로드 파일과 같이 변경됩니다.
설정 파일 업로드 디렉토리

다음과 같은 구성을 추가, sandboxMP / sandboxMP / settings.py 파일을 수정 :

MEDIA_URL = '/media/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

열기 sandboxMP / sandboxMP / urls.py는 다음과 같은 구성을 추가 :

from django.conf import settings
from django.urls import re_path
from django.views.static import serve if settings.DEBUG: urlpatterns += [ re_path(r'^media/(?P<path>.*)$', serve, {"document_root": settings.MEDIA_ROOT}), ] 

사용자가 사진을 볼 수있는 페이지를 새로 고침, 우리는이 구성 모드는 생산 환경에서 모델을 개발하는 데 사용되어야하기 때문에 여기 경우 이성의 사용이 settings.DEBUG, 웹 전에 채택해야 있습니다

추천

출처www.cnblogs.com/jameslove/p/10988290.html