Django 에서 session 권한 관리 사용

session 이 활성화 되면 보기 request 인자 에 전 달 된 HttpRequest 대상 은 사전 대상 처럼 session 속성 을 포함 합 니 다.Django 의 어느 곳 에서 든 request.session 속성 을 읽 거나 여러 번 편집 해서 사용 할 수 있 습 니 다.
이 파일 은 제 C:\\Users\\17764530215\\test\mysite 주소 에 있 습 니 다.
1.urls.py

from django.contrib import admin
from django.urls import path
from login import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index),
    path('login/', views.login),
    path('register/', views.register),
    path('logout/', views.logout),
]


정책:
  • 로그 인 하지 않 은 사람 은 index 를 방문 하 든 login 과 logout 을 방문 하 든 모두 login 인터페이스 로 이동 합 니 다
  • 로그 인 한 사람,login 을 방문 하면 index 페이지 로 자동 으로 이동 합 니 다
  • 이미 로그 인 한 인원,register 페이지 에 직접 방문 할 수 없습니다.먼저 logout
  • 로그 인 후,자동 으로 login 인터페이스 로 이동 합 니 다
  • (wow,이것 이 사실 우리 의 기능 이다!!)
    2.login/models.py
    
    from django.db import models
    
    # Create your models here.
    
    
    class User(models.Model):
    
        gender = (
            ('male', " "),
            ('female', " "),
        )
    
        name = models.CharField(max_length=128, unique=True)
        password = models.CharField(max_length=256)
        email = models.EmailField(unique=True)
        sex = models.CharField(max_length=32, choices=gender, default=" ")
        c_time = models.DateTimeField(auto_now_add=True)
    
        def __str__(self):
            return self.name
    
        class Meta:
            ordering = ["-c_time"]
            verbose_name = "  "
            verbose_name_plural = "  "
    
    
    필드 별 의미:
    name:필수,최 장 128 자 를 초과 하지 않 으 며 유일 하 게 같은 이름 을 가 질 수 없습니다.password:필수,최 장 256 자 를 초과 하지 않 습 니 다.email:Django 에 내 장 된 메 일 형식 을 사용 하고 유일 합 니 다.섹스:성별,choice 를 사 용 했 습 니 다.남자 나 여자 만 선택 할 수 있 고 기본적으로 남자 입 니 다.사용str__방법 은 인성 화 된 대상 정 보 를 나타 내 는 데 도움 을 준다.메타 데이터 에서 사용자 가 생 성 시간의 역순 으로 배열 하 는 것 을 정의 합 니 다.즉,최근 에 가장 먼저 표 시 된 것 입 니 다.
    3.views.login 과 login.html
    views.login:
    
    def login(request):
        if request.session.get('is_login', None):  #        
            return redirect('/index/')
        if request.method == 'POST':
            login_form = forms.UserForm(request.POST)   #          ,              
            message = '        !'
            if login_form.is_valid():
                username = login_form.cleaned_data.get('username')
                password = login_form.cleaned_data.get('password')
    
                try:
                    user = models.User.objects.get(name=username)
                except :
                    message = '     !'
                    return render(request, 'login/login.html', locals())
    
                if user.password == password:   #           
                    #  session            :
                    request.session['is_login'] = True  #is_login=True      
                    request.session['user_id'] = user.id
                    request.session['user_name'] = user.name
                    return redirect('/index/')  #      
                else:
                    message = '     !'
                    return render(request, 'login/login.html', locals())
            else:
                return render(request, 'login/login.html', locals())
    
        #   POST  ,    login.html
        login_form = forms.UserForm()
        return render(request, 'login/login.html', locals())
    우 리 는 login 에 들 어 갈 때 session 에서 is 를 찾 습 니 다.login 항목,true 라면 로그 인 했 음 을 표시 하기 때문에/index/로 다시 설정 하여 첫 페이지 에 들 어 갑 니 다.
    false,즉 로그 인 하지 않 았 다 면 아래로 내 려 가세 요.POST 방법 이 라면 일련의 작업 을 수행 합 니 다.POST 가 아니라면 처음으로 GET 방식 으로 이 login 홈 페이지 에 로그 인 한 것 임 을 표시 합 니 다.forms.Userform 으로 대상 login 을 만 듭 니 다.form,이 를 매개 변수 로 login/login.html 템 플 릿 파일 에 전달 하고 잠시 후에 이 파일 을 소개 합 니 다.
    만약 에 False 이 고 POST 일 때 양식 을 작성 했다 는 것 을 나타 내 는데 여 기 는 많은 업무 논리 와 session 의 관리 와 관련 되 고 중심 적 으로 말 합 니 다.하면,만약,만약...form.is_valid()는 다음 과 같 습 니 다:loginform=forms.Userform(request.POST)은 이 폼 데 이 터 를 작성 한 다음 데이터베이스 의 사용자 이름과 비밀 번 호 를 검증 합 니 다.통과 하면 request.session[islogin]트 루 로 변경 하여 로그 인 상 태 를 표시 하고 userid 와 username 필드 도 대응 하 는 데이터 로 바 뀌 었 습 니 다.이 다음 에 유용 할 것 입 니 다.
    다음은 login/login.html 로 들 어 갑 니 다.
    
    <!doctype html>
    <html lang="en">
      <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <!--   meta  *  *     ,       *  *    ! -->
        <!-- Bootstrap CSS -->
        <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
        <title>  </title>
      </head>
      <body>
        <div class="container">
                <div class="col">
                    <form class="form-login" action="/login/" method="post">
                      {% if message %}
                        <div class="alert alert-warning">{{ message }}</div>
                      {% endif %}
                      {% csrf_token %}
                      <h3 class="text-center">    </h3>
    
                      {{ login_form }}
    
                      <div>
                          <a href="/register/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="text-success " ><ins>     </ins></a>
                          <button type="submit" class="btn btn-primary float-right">  </button>
                      </div>
                    </form>
                </div>
        </div> <!-- /container -->
    
        <!-- Optional JavaScript -->
        <!-- jQuery first, then Popper.js, then Bootstrap JS -->
        {#                 #}
        <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
        <script src="https://cdn.bootcss.com/popper.js/1.15.0/umd/popper.js"></script>
        <script src="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
    
      </body>
    </html>
    여기 서 중요 한 것 은 이 문구 입 니 다.{loginform},이 위치 에 폼 login 을 삽입 하 였 습 니 다.form,그리고 이 양식 을 작성 한 후 view 안의 login 함수 로 login 을 실행 합 니 다.form=forms.Userform(request.POST)에서 작성 한 이 폼 데 이 터 를 가 져 온 다음 검사 등 을 수행 합 니 다.
    이 두 가지 가 있 으 면 우리 의 권한 관 리 는 기본적으로 완성 된다!본질 적 으로 이 두 가 지 는 입력 한 사용자 데이터 에 대해 session 에 존재 한 다음 에 검사 할 때 session 에서 꺼 내 합 법 적 인 사용자 인지 판단 할 수 있 는 메커니즘 을 제공 했다.그러면 우 리 는 index.html 를 다시 수정 하고 session 으로 검사 해 야 합 니 다.그러면 인터넷 주 소 를 통 해 직접 방문 하 는 사용 자 는 session 이 없 기 때문에 차단 당 합 니 다!
    4.views.index
    
    def index(request):
        if not request.session.get('is_login', None):   #        ,     login
            return redirect('/login/')
        return render(request, 'login/index.html')  #       ,   index.html     
    
    
    로그 인 상태 가 아니라면 login 으로 다시 설정 합 니 다.로그 인 상태 에 있 으 면 실제 login/index.html 템 플 릿 으로 다시 설정 합 니 다.이 템 플 릿 에서 우 리 는 각종 기능 을 개발 할 수 있 습 니 다.이 demo 의 login/index/html 은 다음 과 같 습 니 다.
    
    <!DOCTYPE html>
        <!-- Optional JavaScript -->
        <!-- jQuery first, then Popper.js, then Bootstrap JS -->
        {#                 #}
        <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
        <script src="https://cdn.bootcss.com/popper.js/1.15.0/umd/popper.js"></script>
        <script src="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
    ​
      </body>
    </html>
    여기 서 중요 한 것 은 이 문구 입 니 다.{loginform},이 위치 에 폼 login 을 삽입 하 였 습 니 다.form,그리고 이 양식 을 작성 한 후 view 안의 login 함수 로 login 을 실행 합 니 다.form=forms.Userform(request.POST)에서 작성 한 이 폼 데 이 터 를 가 져 오고 검사 하 는 등 작업 을 합 니 다.이 두 가지 가 있 으 면 우리 의 권한 관 리 는 기본적으로 완 료 됩 니 다!본질 적 으로 이 두 가 지 는 입력 한 사용자 데이터 에 대해 session 에 존재 한 다음 에 검사 할 때 session 에서 꺼 내 합 법 적 인 사용자 인지 판단 할 수 있 는 메커니즘 을 제공 했다.그러면 우 리 는 index.html 를 다시 수정 하고 session 으로 검사 해 야 합 니 다.그러면 인터넷 주 소 를 통 해 직접 방문 하 는 사용 자 는 session 이 없 기 때문에 차단 당 합 니 다!​
    4.views.index
    
    def index(request):
        if not request.session.get('is_login', None):   #        ,     login
            return redirect('/login/')
        return render(request, 'login/index.html')  #       ,   index.html     
    
    로그 인 상태 가 아니라면 login 으로 다시 설정 합 니 다.로그 인 상태 에 있 으 면 실제 login/index.html 템 플 릿 으로 다시 설정 합 니 다.이 템 플 릿 에서 우 리 는 각종 기능 을 개발 할 수 있 습 니 다.이 demo 의 login/index/html 은 다음 과 같 습 니 다.
    
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>  </title>
    </head>
    <body>
    <h1>{{ request.session.user_name }}!      !</h1>
    <p>
        <a href="/logout/">  </a>
    </p>
    </body>
    </html>

    마지막 으로 logout 의 실현 을 살 펴 보 겠 습 니 다.
    5.views.logout
    
    def logout(request):    #  
        if not request.session.get('is_login', None):   #        ,          
            #         ,        
            return redirect("/login/")
    
        request.session.flush() #  session
        #          
        # del request.session['is_login']
        # del request.session['user_id']
        # del request.session['user_name']
        return redirect("/login/")  #    login  
    
    
    로그 인하 지 않 으 면 직접/login/인터페이스 로 전환 합 니 다.로그 인 상태 라면 request.session.flush()를 통 해 session 을 비 운 다음/login/로그 인 인터페이스 로 다시 설정 해 야 합 니 다.
    6.세 션 과 forms 의 조합 정리
    forms 는 html 에서 폼 과 대상 을 연결 하면 폼 을 작성 한 후에 forms 를 통 해 작성 한 내용 을 쉽게 찾 을 수 있 습 니 다.
    session 은 사실 권한 검증 의 이기 입 니 다!session 이 없 을 때 사용 자 는 index 인터페이스 에 직접 방문 할 수 있 습 니 다.session 이 있 을 때 index 함수 의 처리 논 리 는 session 을 통 해 로그 인 여 부 를 판단 할 수 있 습 니 다.물론 이에 맞 춰 login,logout 등 함수 로 이 session 정 보 를 잘 유지 하고 불변성 을 확보 해 야 합 니 다.모든 session 중의 islogin 필드 가 True 일 때,모두 진정한 로그 인 사용자 입 니 다.
    Django 의 session 권한 관리 사용 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.Django session 권한 관리 에 관 한 더 많은 내용 은 이전 글 을 검색 하거나 아래 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기