Django 진급: CSRF 소스 분석, 페이지 분할기, 중간부품, 캐시, 신호 상세 설명
예를 들어 나는 나의 어떤 학우와 밥을 먹으러 가고 싶지만, 나와 그의 앞에는 몇 줄의 사람들이 떨어져 있다. 내가 그녀를 찾으려면, 나는 이 몇 줄의 사람들을 통과해야 한다
CSRF
CSRF가 뭐야?
크로스컨트리 요청 위조라고 합니다. 이전에 많은 학생들이 Django를 처음 배웠는데 CSRF 중간부품을 직접 제거하거나 표에
{% csrf_token %}
를 추가할 수 있습니다. 그런데 원리는 무엇입니까?사실 우리는 { csrf_token }
로 앞부분에 표시할 수 있는데 그것이 바로 문자열이라는 것을 알 수 있다. get 요청으로 서버에 접근할 때 서버는 내용을 되돌려줄 뿐만 아니라 암호화된 문자열도 준다. 이 암호화된 문자열은 서버만 반해할 수 있고 클라이언트가 데이터를 제출할 때 반드시 이 문자열을 가지고 와야 한다. 그렇지 않으면 나는 너에게 제출하지 않을 것이다.CSRF의 역할은 무엇입니까
크로스오버 요청 위조를 방지하는 것이다. 솔직히 해커가 우리의 폼에 데이터를 제출하는 것을 방지하고 CSRF를 추가한 후에 우리의 폼과 aax 방식으로 제출하는 것을 처리해야 한다.
페이지 나누기
Django에 paginator 페이지 분할기가 내장되어 있음
from django.core.paginator import Paginator
object.all()
queryset 대상을 조회하는 것이다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 함수에 도달할 수 있다.
사용자 정의 중간부품
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')
면접 시험
너는 중간부품으로 무엇을 한 적이 있니?
캐시가 무엇인지, 무엇을 하는지
저희 사이트는 대부분 동적 요청으로 데이터에 따라 작업을 하기 때문에 프로그램의 방문량이 많으면 시간이 많이 걸립니다. 이때 가장 간단한 방법은 캐시를 사용하여view의 반환값을 메모리에 저장하는 것입니다. 5분 안에 누가 방문하면 바로 Redis에 가져가거나 메모리에 가져가서 돌아오는 것입니다.
Django 지원 캐시
많은 웹 프레임워크에 이런 것이 없다. Django만 있고 캐시도 매우 간단하다. 설정만 하면 된다.Django의 6가지 캐시 방식:
캐시 응용
@cache_page(10)
10은 시간 초과가 10초임을 의미하며, 캐시할 함수에cache페이지 꾸미기{% load cache %}
시그널
신호가 뭐예요?
Django는 매우 튼튼한 구조이다. 소는 많은 곳에서 우리에게 갈고리를 남겼다. Django에서 신호 스케줄링을 제공했다. 구조에서 조작을 수행할 때의 결합에 사용된다. 통속적으로 말하면 일부 동작이 발생할 때 신호는 너무 특정한 발송자가 수용자를 일깨워 주는 것을 허용한다.
시그널
신호의 작용이 커요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Rails Turbolinks를 페이지 단위로 비활성화하는 방법원래 Turobolinks란? Turbolinks는 링크를 생성하는 요소인 a 요소의 클릭을 후크로 하고, 이동한 페이지를 Ajax에서 가져옵니다. 그 후, 취득 페이지의 데이터가 천이 전의 페이지와 동일한 것이 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.