16:django 조건부 보기 처리(Last-Modified 및 ETag) & 암호화 서명

10682 단어 django

조건부 뷰 처리


지난 절에서 우리는 캐시를 소개하여 서버의 부담을 줄였다. 이곳의 조건부 보기 처리도 어느 정도 서버의 부담을 줄였다. 정식으로 소개하기 전에 두 가지 개념을 살펴보자. Last-Modified와 ETag

Last-Modified


브라우저에서 URL을 처음 요청할 때 서버 측의 반환 상태는 200이고 내용은 클라이언트가 요청한 자원이며 Last-Modified의 속성은 이 파일이 서비스 기간 마지막에 수정된 시간을 표시합니다. 형식은 다음과 같습니다.
Last-Modified : Fri , 12 May 2006 18:53:33 GMT
클라이언트가 두 번째로 이 URL을 요청할 때 HTTP 프로토콜에 따라 브라우저는 서버에 If-Modified-Since 헤더를 전송하여 이 시간 이후에 파일이 수정되었는지 묻습니다.
If-Modified-Since : Fri , 12 May 2006 18:53:33 GMT
서버 측 리소스가 변경되지 않으면 자동으로 HTTP 304(Not Changed)로 돌아갑니다.상태 코드, 내용이 비어 전송 데이터의 양을 절약할 수 있습니다.서버 사이드 코드가 바뀌거나 서버를 다시 시작할 때, 자원을 다시 보내고, 첫 번째 요청과 유사하게 되돌려줍니다.따라서 클라이언트에게 자원을 중복 발송하지 않고 서버에 변화가 있을 때 클라이언트가 최신 자원을 얻을 수 있도록 보장한다.

ETag


요청 프로세스


Etag는 서버 쪽에서 생성되고 클라이언트는 If-Match 또는 If-None-Match라는 조건을 통해 요청을 판단하여 자원의 수정 여부를 검증합니다.흔히 볼 수 있는 것은 If-None-Match를 사용하는 것이다.파일을 요청하는 절차는 다음과 같습니다.
==== 첫 번째 요청 ==
1. 클라이언트가 HTTP GET를 시작하여 파일을 요청합니다.
2. 서버가 요청을 처리하고 파일 내용과 헤더를 되돌려줍니다. 당연히 Etag(예를 들어 "2e681a-6-5d044840")를 포함합니다(예를 들어 서버가 Etag 생성을 지원하고 Etag를 열었다고 가정).상태 코드 200
==== 두 번째 요청 ==
1. 클라이언트가 HTTP GET를 시작하여 파일을 요청합니다. 이때 클라이언트가 If-None-Match 헤더를 동시에 보내는 것을 주의하십시오. 이 헤더의 내용은 첫 번째 요청 시 서버가 되돌아오는 Etag:2e681a-6-5d044840입니다.
2. 서버는 전송된 Etag와 계산된 Etag가 일치한다고 판단하기 때문에 If-None-Match는 False이고 200을 반환하지 않고 304를 반환하며 클라이언트는 로컬 캐시를 계속 사용한다.
절차가 간단합니다. 문제는 서버에 Cache-Control:max-age와 Expires를 설치하면 어떻게 합니까?
답은 동시에 사용하는 것입니다. 즉, If-Modified-Since와 If-None-Match가 완전히 일치하는 수정 시간과 Etag를 검사한 후에야 서버가 304로 되돌아갈 수 있습니다.(도대체 누구를 쓰느냐의 문제에 빠지지 마라)

작용


Etag는 주로 Last-Modified가 해결할 수 없는 몇 가지 문제를 해결하기 위한 것이다.
1. 일부 파일은 주기적으로 변경될 수 있지만 그의 내용은 변하지 않는다. (변경된 수정 시간만) 이때 우리는 클라이언트가 이 파일이 수정되었다고 생각하고 다시 GET하기를 원하지 않는다.
2. 일부 파일의 수정이 매우 빈번하다. 예를 들어 초 이하의 시간에 수정을 한다. (예를 들어 1s내에 N회 수정을 했다). 만약에 f-Modified-Since가 검사할 수 있는 입도는 s급이다. 이런 수정은 판단할 수 없다(또는 UNIX 기록 MTIME은 초까지만 정확하다).
3. 일부 서버는 파일의 마지막 수정 시간을 정확하게 얻지 못한다.
이를 위해 HTTP/1.1은 Etag(Entity Tags)를 도입했습니다.Etag는 파일과 관련된 표지일 뿐이고 버전 표지일 수 있다. 예를 들어 v1.0.0이나'2e681a-6-5d044840'같은 신비해 보이는 인코딩이다.그러나 HTTP/1.1 표준은 Etag의 내용이 무엇인지 또는 어떻게 실현해야 하는지를 규정하지 않았고 유일하게 Etag는''안에 두어야 한다고 규정했다.
 
이 두 개념을 알게 된 후에 우리는 이 두 개념의 작용을 알아야 한다. 또한 우리가 다음에 설명해야 할 것이 무엇인지 대충 알 것이다.맞아요. 바로, django에서 Last-Modified와 ETag라는 두 개념을 어떻게 사용하나요.

condition 장식기


Last-Modified와 ETag는 django에서 두 개의 함수이다. 전자는 하나의 날짜 형식 데이터를 되돌려주고 후자는 하나의 값(Etag 값)을 되돌려준다. 이 두 함수는django에 매개 변수로 전달할 수 있다.views.decorators.http.condition 이 장식기, 장식기 원형은

condition(etag_func=None, last_modified_func=None)


이것은 사용하는 간단한 예이다
def latest_entry(request, blog_id):

    return Entry.objects.filter(blog=blog_id).latest("published").published

from django.views.decorators.http import condition

@condition(last_modified_func=latest_entry)

def front_page(request, blog_id):

    ...

django에 있어요.views.decorators.http.condition 파일에는 또 다른 두 개의 장식기가 제공되어 하나의 매개 변수만 제공하면 원본 코드를 쉽게 이해할 수 있습니다.
def etag(etag_func):

    return condition(etag_func=etag_func)



def last_modified(last_modified_func):

    return condition(last_modified_func=last_modified_func)

Last-Modified와 ETag가 끝났습니다. 계속해서 말씀드리겠습니다.

django 암호화 서명


웹 응용 안전의 황금 법칙은 신뢰받지 않는 데이터를 영원히 믿지 말라는 것이다.그러나 때때로 우리는 신뢰를 받지 않는 매체로부터 데이터를 얻거나 발송하거나 신뢰를 받지 않는 매체가 더 매력적이다. 예를 들어 우리는 우리의 데이터가 반드시 안전하고 신뢰를 받지 않는 매체가 신뢰를 받는 매체보다 빠르고 심지어 싸다는 것을 확보할 수 있다.암호화 서명의 값이 왜곡되면 검출된다는 것은 우리가 데이터 안전을 확보할 수 있다는 공통된 인식이다.다음은 몇 가지 암호화 서명 응용 프로그램의 예입니다.
  • 비밀번호를 찾는 데 사용되는 URL입니다
  • 폼의 숨겨진 영역이 수정되지 않았는지 확인하십시오
  • 보호 데이터에 접근할 수 있는 암호화 URL입니다

  • django는 데이터 암호화를 위한 밑바닥 API와 암호화 쿠키를 설정하고 읽는 데 사용되는 고위층 API를 제공합니다

    너의 시크릿을 지켜라_KEY


    django-admin으로.pystartproject 명령으로 생성된 항목은 자동으로 무작위로 생성되는 SECRET_KEY, 이 키를 누설하지 않도록 주의하세요.

    저차원 API 사용


    django의 암호화 방법 원본 코드는django\core 디렉터리에 있는signing입니다.py 파일, 구체적으로 볼 수 있습니다. 다음은 기본적인 사용법입니다.
    >>> from django.conf import settings
    
    >>> settings.configure()
    
    >>> from django.core.signing import Signer
    
    >>> signer = Signer()
    
    >>> value = signer.sign("qiweijie")
    
    >>> value
    
    'qiweijie:lVrPb11e1K9K_DcxnMGNYk8t2aQ'
    
    >>> original = signer.unsign(value)
    
    >>> original
    
    u'qiweijie'

    "조미료" 파라미터 사용하기(salt)


    소금, 조미료
    >>> signer = Signer()
    
    >>> signer.sign('My string')
    
    'My string:GdMGD6HNQ_qdgxYP8yBZAdAIV1w'
    
    >>> signer = Signer(salt='extra')
    
    >>> signer.sign('My string')
    
    'My string:Ee7vGi-ING6n02gkcJ-QLHg6vFw'
    
    >>> signer.unsign('My string:Ee7vGi-ING6n02gkcJ-QLHg6vFw')
    
    u'My string'

    유효성 검사 시간 스탬프


    TimestampSigner는 Signer의 하위 클래스로 암호화된 시간 스탬프 값을 추가합니다.이것은 암호화된 데이터가 주어진 시간 안에 만들어지는 것을 확보할 수 있게 한다
    >>> from django.core.signing import TimestampSigner
    
    >>> signer = TimestampSigner()
    
    >>> value = signer.sign('hello')
    
    >>> value
    
    'hello:1NMg5H:oPVuCqlJWmChm1rA2lyTUtelC-c'
    
    >>> signer.unsign(value)
    
    u'hello'
    
    >>> signer.unsign(value, max_age=10)
    
    ...
    
    SignatureExpired: Signature age 15.5289158821 > 10 seconds
    
    >>> signer.unsign(value, max_age=20)
    
    u'hello'

    복잡한 데이터 구조 보호


    목록, 모듈, 사전, 만약 당신이 상술한 방법을 직접 사용한다면, 마지막에는 원래의 데이터 형식이 아닌 문자열을 얻을 수 있습니다.
    >>> dic = {1:2}
    
    >>> sd=signer.sign(dic)
    
    >>> signer.unsign(sd)
    
    u'{1: 2}'

    이 데이터 형식을 보호하려면dumps와loads 방법을 사용하십시오. 이것들은 모두django에 있습니다.core.signing 모듈 안에
    dumps(
    obj, 
    key=None, 
    salt='django.core.signing', 
    compress=False)
    loads(
    string, 
    key=None, 
    salt='django.core.signing', 
    max_age=None)
    >>> from django.core import signing
    
    >>> value = signing.dumps({"foo": "bar"})
    
    >>> value
    
    'eyJmb28iOiJiYXIifQ:1NMg1b:zGcDE4-TCkaeGzLeW9UQwZesciI'
    
    >>> signing.loads(value)
    
    {'foo': 'bar'}

    좋은 웹페이지 즐겨찾기