Django 진급: CSRF 소스 분석, 페이지 분할기, 중간부품, 캐시, 신호 상세 설명

29769 단어 #django
문서 목록
  • 인자
  • CSRF
  • CSRF는 무슨 물건이야
  • CSRF가 무슨 작용을 하는지
  • 분기기
  • 중간부품
  • 중간부품이 뭐예요?
  • 중간부품은 무엇에 쓰는가
  • 사용자 정의 중간부품
  • 면접
  • 캐시
  • 캐시가 무엇인지, 무엇을 하는지
  • Django 지원 캐시
  • 캐시의 응용
  • 신호
  • 신호가 무엇입니까
  • 신호
  • 도입부
    예를 들어 나는 나의 어떤 학우와 밥을 먹으러 가고 싶지만, 나와 그의 앞에는 몇 줄의 사람들이 떨어져 있다. 내가 그녀를 찾으려면, 나는 이 몇 줄의 사람들을 통과해야 한다
    CSRF
    CSRF가 뭐야?
    크로스컨트리 요청 위조라고 합니다. 이전에 많은 학생들이 Django를 처음 배웠는데 CSRF 중간부품을 직접 제거하거나 표에 {% csrf_token %}를 추가할 수 있습니다. 그런데 원리는 무엇입니까?사실 우리는 { csrf_token }로 앞부분에 표시할 수 있는데 그것이 바로 문자열이라는 것을 알 수 있다. get 요청으로 서버에 접근할 때 서버는 내용을 되돌려줄 뿐만 아니라 암호화된 문자열도 준다. 이 암호화된 문자열은 서버만 반해할 수 있고 클라이언트가 데이터를 제출할 때 반드시 이 문자열을 가지고 와야 한다. 그렇지 않으면 나는 너에게 제출하지 않을 것이다.
    CSRF의 역할은 무엇입니까
    크로스오버 요청 위조를 방지하는 것이다. 솔직히 해커가 우리의 폼에 데이터를 제출하는 것을 방지하고 CSRF를 추가한 후에 우리의 폼과 aax 방식으로 제출하는 것을 처리해야 한다.
    페이지 나누기
    Django에 paginator 페이지 분할기가 내장되어 있음from django.core.paginator import Paginator
  • Django의 페이지 나누기를 사용하는데 문법은 백엔드에서 먼저object.all()queryset 대상을 조회하는 것이다
  • 다음에queryset 대상과 페이지당 몇 개의 데이터를 만드는 매개 변수로 Paginator 대상을 만듭니다
  • 그리고 try를 사용하여 사용자가 입력한 잘못된 URL의 이상을 포착하는 것을 기억해야 한다
  • def index(request):
        #     
        # book_list = []
        # for i in range(100, 200):
        #     obj = models.Book(price=i*i, name='   '+str(i)+'  ')
        #     book_list.append(obj)
        # models.Book.objects.bulk_create(book_list)
        book_list = models.Book.objects.all()
        paginator = Paginator(book_list, 10)
        print('paginator count:',paginator.count)
        print('num_page', paginator.num_pages)
        print('page_range', paginator.page_range)
        try:
            current_page = int(request.GET.get('page', 1))
            page = paginator.page(current_page)
            #         ,         
            if paginator.num_pages > 10:
                #        
                if current_page-5 < 1:
                    page_range = range(1, 11)
                elif current_page+5 > paginator.num_pages:
                    page_range = range(paginator.num_pages-10, paginator.num_pages+1)
                else:
                    page_range = range(current_page-5, current_page+5)
            print('object_list:', page.object_list)
            for i in page:
                print(i)
        except EmptyPage as e:
            #   URL   ,      
            page = paginator.page(1)
        return render(request, 'index.html', locals())
    

    index.html 코드, 주석이 상세하기 때문에 일일이 말하지 않겠습니다
    
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>Titletitle>
       <link rel="stylesheet" href="/static/bootstrap-3.3/css/bootstrap.css"/>
       <link rel="stylesheet" href="/static/bootstrap-3.3/css/bootstrap-theme.css"/>
       <style>
    
       style>
    head>
    <body>
       
       {% for item in page  %}
           {{ item.price }}-{{ item.name }}<br>
       {% endfor %}
       <nav aria-label="Page navigation">
         <ul class="pagination">
         {% if page.has_previous %}
           <li>
             <a href="?page={{ page.previous_page_number }}" aria-label="Previous">
               <span aria-hidden="true">   span>
             a>
           li>
         {% else %}
             
           <li>
             <a href="#" aria-label="Previous" class="disabled">
               <span aria-hidden="true">   span>
             a>
           li>
         {% endif %}
           
           {% for item in page_range %}
               {% if item == current_page %}
                   <li class="active"><a href="?page={{ item }}">{{ item }}a>li>
               {% else %}
                   <li><a href="?page={{ item }}">{{ item }}a>li>
               {% endif %}
           {% endfor %}
         {% if page.has_next %}
           <li>
             <a href="?page={{ page.next_page_number }}" aria-label="Next">
               <span aria-hidden="true">   span>
             a>
           li>
         {% else %}
               
           <li>
             <a href="#" aria-label="Next" class="disabled">
               <span aria-hidden="true">   span>
             a>
           li>
         {% endif %}
         ul>
       nav>
    body>
    html>
    

    중간부품
    중간부품은 무엇입니까?
    그는 브라우저와 서버 사이의 갈고리이다. 우리가 요청을 할 때view층에 도착하기 전에 일련의 중간부품, 예를 들어CSRF 보호 등을 통과한 다음에view층에서 브라우저에 요청을 되돌려줄 때도 중간부품을 거쳐야 한다. Django1.10 후 버전, 어떤 요청이 중간부품에서 차단되면 (예: CSRF 보호) 이 중간부품에서 되돌아옵니다. 뒤의 중간부품을 통과하여view 함수에 도달하는 것이 아니라, Django 초기 버전에서 중간부품을 요청하지 못할 때, 마지막 중간부품을 계속 걷고 다시 돌아갑니다. 어쨌든 중간부품에 의해 차단된 후에는 시청층에 도착하지 않습니다.
    중간부품은 무엇에 쓰느냐
    중간부품은view 함수에 도달하기 전에 요청에 대해 조작을 하거나 보안 정책을 할 수 있다. 예를 들어 우리가 일부 IP를 필터해서 이 IP에 접근하지 않으려면 우리는 스스로 중간부품을 정의할 수 있다. 또한Django는 CSRF 보호 등 많은 중간부품을 가지고 있다. 요청은 이 보호 장벽을 통과해야만 우리view 함수에 도달할 수 있다.
    사용자 정의 중간부품
  • Django 프로젝트 아래에 폴더를 만들고 이 폴더 아래diy에 중간부품
  • from django.utils.deprecation import MiddlewareMixin
    
    class One(MiddlewareMixin):
    
        def process_request(self, request):
            print('     process_request')
    
        def process_response(self, request, response):
            print('     process_response')
            return response
    
    
    class Two(MiddlewareMixin):
    
        def process_request(self, request):
            print('     process_request')
    
        def process_response(self, request, response):
            print('     process_response')
            return response
    
    
    class Three(MiddlewareMixin):
    
        def process_request(self, request):
            print('     process_request')
    
        def process_response(self, request, response):
            print('     process_response')
            return response
    
  • 사용자 정의 중간부품을 프로필에 쓰기
  • MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'm.diymiddle.One',
        'm.diymiddle.Two',
        'm.diymiddle.Three',
    ]
    

    뷰 레이어
    def test(request):
        print('i love django')
        return HttpResponse('OK')
    

    면접 시험
    너는 중간부품으로 무엇을 한 적이 있니?
  • 역할 기반 권한 제어
  • 사용자 인증
  • 블랙리스트 필터
  • csrf(원리 설명)
  • session(원리 설명)
  • 캐시
    캐시가 무엇인지, 무엇을 하는지
    저희 사이트는 대부분 동적 요청으로 데이터에 따라 작업을 하기 때문에 프로그램의 방문량이 많으면 시간이 많이 걸립니다. 이때 가장 간단한 방법은 캐시를 사용하여view의 반환값을 메모리에 저장하는 것입니다. 5분 안에 누가 방문하면 바로 Redis에 가져가거나 메모리에 가져가서 돌아오는 것입니다.
    Django 지원 캐시
    많은 웹 프레임워크에 이런 것이 없다. Django만 있고 캐시도 매우 간단하다. 설정만 하면 된다.Django의 6가지 캐시 방식:
  • 개발 디버깅(기본값), 이건 장난이고 실제 내부에서는 아무런 조작도 하지 않습니다
  • 메모리, 메모리 버전을 설정할 때 반드시 값을 설정해야 합니다. 이 값은 유일합니다. 이 캐시는 내용을 메모리 변수에 저장합니다
  • 파일
  • 데이터베이스
  • Memcache 캐시(Python 모듈 사용), 이것은 Django와 아무런 관계가 없습니다.

  • 캐시 응용
  • 전역 캐시(전체 사이트에서 캐시): 응용이 적고 중간부품을 사용
  • 단일view 함수에 사용:cache 가져오기페이지, @cache_page(10)10은 시간 초과가 10초임을 의미하며, 캐시할 함수에cache페이지 꾸미기
  • 국부 템플릿 사용 캐시: 이것은 더욱 작고 세밀한 캐시입니다. 이것은 너무 유용합니다. 왜냐하면 우리 사이트는 모든 곳에서 캐시를 사용하기 때문에 변하지 않는 데이터만 캐시를 합니다.
  • {% load cache %}
    

    시그널
    신호가 뭐예요?
    Django는 매우 튼튼한 구조이다. 소는 많은 곳에서 우리에게 갈고리를 남겼다. Django에서 신호 스케줄링을 제공했다. 구조에서 조작을 수행할 때의 결합에 사용된다. 통속적으로 말하면 일부 동작이 발생할 때 신호는 너무 특정한 발송자가 수용자를 일깨워 주는 것을 허용한다.
    시그널
    신호의 작용이 커요.
  • 예를 들어 우리가 서버를 감시하러 갈 때 어떤 밸브값에 도달하면 신호를 촉발하고 위챗 알림을 촉발하는 등
  • 예를 들어 우리는 데이터 기록을 삽입할 때마다 로그를 추가하고 싶다
  • 시나닷컴 면접 문제 보기: 만약 내가 모든 데이터베이스를 조작할 때 그에게 일지를 하나 더 넣고 싶다면 어떻게 해야 합니까?이때 많은 사람들이 장식기를 생각했을 것이다. 그 전...후로 장식기를 사용했지만 장식기는 입도가 가늘지 않아서 정답은 Django의 내장 신호를 사용했다.

    좋은 웹페이지 즐겨찾기