장고의 세션 쿠키 및 구성 요소

첫째, 세션 추적 기술

1.1 세션 추적 무엇입니까

우리는 대화가 무엇인지 살펴볼 필요가! 대화는 여러 요청과 응답을 포함 할 수있는 회의에서 클라이언트와 서버 간의 회의로 이해 될 수있다. 서버가 10086 명 서비스 직원 동안 예를 들어, 클라이언트이며, 10086로 전화를 걸. 양측이 전화를 연결하는 순간부터, 세션이 전화가 세션의 끝을 나타냅니다 끊어야 하나, 시작했다. 통화 중에, 당신은 10086에 여러 요청, 그래서 하나의 세션에서 그 여러 요청을 할 수 있습니다. 
웹에서 첫 번째 클라이언트는 고객의 끝이 브라우저 세션을 닫을 때까지 세션을 시작하는 서버에 요청이 시작 보냅니다. 

세션 추적 기술 세션 요청에서 공유 된 데이터의 복수. 다음과 같이 하나의 예에서, 세션 요청은 다음과 같습니다  홈 뱅킹 요청; 

  • 요청 착륙 (요청 매개 변수는 사용자 이름 및 암호입니다)
  • 전송 요구 (전송 요구 파라미터 데이터와 연관된)
  • 요청 신용 카드 결제 (데이터의 상환에 관한 요청 매개 변수) 

로그인이 조 스미스, 조 스미스는 다음의 전송 및 상환시 상대적으로 전송 및 지불해야하기 때문에 현재 사용자 정보의이 마지막 세션에서는,이 세션에서 공유해야합니다! 이것은 우리가 세션에서 데이터를 공유 할 수있는 능력이 있어야합니다 것을 알 수있다.

1.2 세션 쿠키 경로 기법 또는 세션 종료를 사용

우리는 HTTP 프로토콜은 각 요청이 독립적 인 것을 의미하는 상태가없는 프로토콜 것을 알고! 요청하기 전에 상태를 기록 할 수 없습니다. 그러나, HTTP 프로토콜은 쿠키 세션 추적을 완료 할 수 있습니다! 웹 개발, 세션 추적에 대한 완전한 세션 따라 기본 세션 쿠키 기술.

두 쿠키 소개

쿠키의 기원.

우리 모두는 HTTP 프로토콜가 상태임을 알고있다.

무 상태는 바로 다시 영향을주지 않으며, 이는 직접 응답에 영향을주는 전술 한 요구에 의해 제한되지 않고, 각 요청의 실행 이전 요청 및 후속 요청의 결과에 직접 관련되지 않은 독립적 인 수단 응답 상황을 요청합니다.

 삶을 설명하는 재미있는 단어는 파업으로, 서버에 대한 각 요청은 새입니다.

상태 데이터는 주어진 세션에서 만든 클라이언트와 서버로 이해 될 수 있으며, 어떤 국가는 이러한 데이터가 유지되지 않을 것이라고 생각하지 않습니다 것을. 생성 된 세션 데이터를 우리가 구원해야 할, 즉에있다 "잡아." 그래서 쿠키는 이러한 시나리오에서 태어났다.

2.1 쿠키 란 무엇인가

사실, 쿠키 파이썬 사전 유사한 키값 구조이다. 서버의 응답으로 클라이언트 브라우저로 전송. 그런 다음 클라이언트 브라우저는 서버에 액세스하기 위해 다시 다음 번에 쿠키를 저장하고 다음 쿠키가 서버로 전송. 쿠키는 서버에 의해 생성 한 다음 키 쌍에 응답하여 클라이언트로 전송됩니다. 클라이언트는 쿠키를 저장하며, 쿠키의 소스 (쿠키 서버)를 표시합니다. 클라이언트는 서버가 클라이언트를 식별 할 수 있도록 서버에 요청에 포함 된 모든 서버 쿠키를 보내드립니다 서버에 요청을하면!

2.2 쿠키 원칙

작품 쿠키입니다 : 서버에서 생성 된 내용은, 브라우저가 로컬로 저장 요구를 수신 할 때 브라우저 방문, 서버가이 쿠키 "의 내용으로 판단 할 수 있도록 자동으로 쿠키를 가져올 것이다 브라우저 사람 "가.

2.3 쿠키 사양

  •  쿠키 크기는 4KB 크기 한계; 
  •  클라이언트 브라우저에 최대 20 쿠키 저장 서버; 
  •  300 쿠키까지 저장 브라우저;  

위의 데이터는 당신이 쿠키 사양가 같은 각 쿠키의 크기 일부는 8킬로바이트이다 "확장"수, 오늘의 브라우저 전쟁에서 브라우저의 일부 자신의 능력의 이유를 설명하기 위해, 상대를 격파하기 위해 단지 HTTP 쿠키 사양이지만, 당신은 500 쿠키 등을 저장할 수 있습니다! 그러나 하드 드라이브가 표시되지 않습니다 채울 수 있습니다! 
참고 다른 브라우저는 쿠키의 공유되지 않습니다. 즉, IE는 쿠키가 서버에 저장 보낼 수 없습니다 서버에 액세스하기 위해 IE를 사용하는 경우, 서버는 IE 쿠키를 보낼 것입니다, 다음은 파이어 폭스를 사용하여 서버에 액세스 할 때까지 IE를 저장합니다.

2.4 쿠키 따르면

 만약 서버가 다음 전송할 쿠키 오래된 쿠키를 덮어 반복, 예를 들어, 서버에 의해 전송 된 첫 번째 클라이언트 요청 쿠키이다 집합 쿠키 : A = a 및 제 요청이 서버에 의해 전송된다 : 집합 쿠키 : A = AA, 다음 클라이언트 떠나 단지 쿠키, 즉 A = AA.

브라우저에서 2.5 체크 쿠키

 

세, 장고 운영 쿠키

3.1 취득 쿠키

request.COOKIES [ ' ' ] 
request.get_signed_cookie (키 기본적 = RAISE_ERROR 소금 = ' , MAX_AGE = 없음)

 

매개 변수 :

  • 기본값 : 기본값
  • 소금 : 소금 암호화
  • MAX_AGE : 배경 제어 만료

3.2 설정 쿠키

렙 = HttpResponse에 (...) 
렙 = (요청, ...) 렌더링 

rep.set_cookie (키 값) 
rep.set_signed_cookie을 (키 값 염 = ' 加密盐' )

매개 변수 :

  • 키, 키
  • 값 = '값
  • MAX_AGE = 없음, 쿠키 시간 제한 매개 변수가 None``를 \ 경우, 쿠키가 브라우저를 닫을 때까지 계속 할 시간 (초)을 확장 할 필요가 없다
  • = 없음 기간 제한 없음, 超时 时间 (이미하지 않은 경우 IE는, 그래서 설정이 만료가 필요합니다.)
  • 경로 = '/', 힘 쿠키 경로에 입력하는가, /, 특수 루트 경로 나타냅니다 쿠키 루트 경로 페이지의 URL을 액세스 할 수 있습니다를, 브라우저에만 피하기 위해 경로로 페이지를 다시 쿠키를 전달합니다 다른 응용 프로그램 사이트의 쿠키를 전달합니다.
  • 도메인 도메인 = 없음, 쿠키 당신은 크로스 사이트의 쿠키를 구성하기 위해이 매개 변수를 사용할 수 있습니다 적용되지 않습니다. ". Example.com"이 사이트에 건설 같은 도메인 = 쿠키를 읽을 다음과 같다 : www.example.com, www2.example.com 및 an.other.sub.domain.example.com. 이 매개 변수를 None으로 설정하면, 쿠키 만의 사이트를 설정하여 읽을 수 있습니다
  • 보안 = 거짓, 브라우저 쿠키는 HTTPS를 통해 전달하고 전달됩니다
  • Http 만 = 거짓에만 HTTP 프로토콜 전송, 자바 스크립트를 획득 할 수 없습니다 (절대하지를 캡처의 바닥에 얻을 수 있습니다 적용될 수 있습니다)

3.3 쿠키를 삭제

DEF 짐바브웨 로그 아웃 (요청) : 
    REP = 리디렉션 ( " / 로그인 / " ) 
    rep.delete_cookie ( " 사용자가 " )   #은 usercookie 값은 이전에 사용자의 브라우저에 설정 삭제할 
    돌아 REP를

 

버전 3.4 쿠키 확인 로그인

데프 login_auth (FUNC)
     DEF 내측 (요청 인수 *, ** kwargs로) 
        next_url = request.get_full_path ()
         경우 request.COOKIES.get ( ' is_login ' )
             복귀 FUNC (요청 인수 *, ** kwargs로)
         다른 :
             리턴 리디렉션 ( ' ? cookie_login / 다음 = % S ' % next_url)
     반환 내측 
@login_auth의 
데프 cookie_order (요청)
     리턴 (HttpResponse에를 " 我是订单页面' )
@login_auth
데프 (요청) cookie_index : 
    이름 = request.COOKIES.get ( ' 이름 ' )
     반환 렌더링 (요청, ' cookie_index.html ' , { ' 이름 ' : 이름})
 데프 cookie_login (요청) :
     경우 request.method == ' POST ' : 
        next_url = request.GET.get ( ' 다음 ' ) 
        이름 = request.POST.get ( ' 이름 ' ) 
        암호 = request.POST.get ( ' 비밀번호 ' )
         의 경우 이름 == ' lqz '   암호 == ' 123 ' :
             수입 날짜 
            지금 . datetime.datetime.now = ()의 strftime ( " % Y- % M- % D % X ' )
             인쇄 (현재) 
            OBJ = (next_url) 리디렉션 
            obj.set_cookie ( ' is_login ' , 참) 
            obj.set_cookie ( ' 이름 ' , 이름) 
            obj.set_cookie을 ( ' login_time ' 지금)
             반환 OBJ의 

    복귀 (요청 렌더링 ' cookie_login.html을 ' )
로그인 인증 장식

 

四, 세션

4.1 세션의 기원

쿠키는 어느 정도 해결되지만, a는 요구 사항을 "보유"하지만 4096 바이트 최대 지원 자체 쿠키, 쿠키 및 클라이언트 자체에 저장에, 차단 또는 도난 될 수 있습니다 때문에, 따라서 새로운 무언가가 필요하다, 그것을 더 바이트를 지원하며, 자신이 서버에 저장, 높은 보안이 있습니다. 이 세션입니다.

상태 비 저장 HTTP 프로토콜의 특성에 기반 문제, 서버가 방문자 모르는 "사람." 그리고 상기 쿠키는 다리의 역할을 할 것이다.

우리는 사용자가 쿠키하여 액세스 할 수 있도록, 서버는 사람을 알고, 할당 된 고유 ID를 각 클라이언트 쿠키를 제공 할 수 있습니다 "." 그런 다음 등등 "계정 암호"와 같은 쿠키의 기반으로 우리 아이디 다른, 몇 시간 동안 서버에 저장된 개인 정보를 표시합니다.

결론 : 그래서 우리는 다른 쿠키를 통해 사용자를 식별 할 수 있습니다; 로컬에 저장된 텍스트의 형태로하지만 쿠키는, 그들의 보안이 좋지 부족의 HTTP에 대한 쿠키 최대가 상태, 서버가 ""사람들에게 알려 세션에서 4096 바이트보다 개인 정보와 텍스트를 저장에 대응.

또한, 상기 사실, 쿠키 및 세션의 공통점 가지가 아닌 언어와 프레임으로 제한했다.

 

세션에서 다섯, 장고 관련 방법

# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']


# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

# 会话session的key
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")

# 删除当前会话的所有Session数据(只删数据库)
request.session.delete()
  
# 删除当前的会话数据并删除会话的Cookie(数据库和cookie都删)。
request.session.flush() 
    这用于确保前面的会话数据不可以再次被用户的浏览器访问
    例如,django.contrib.auth.logout() 函数中就会调用它。

# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。

Django中使用session时,做的事:

 

# 生成随机字符串
# 写浏览器cookie -> session_id: 随机字符串
# 写到服务端session:
    # {
    #     "随机字符串": {'user':'alex'}
    # }

 

 

六、Django中的Session配置

1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 

4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

其他公用设置项:
SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

 

七、CBV中加装饰器

from django import views
from django.utils.decorators import method_decorator
# @method_decorator(login_auth,name='get')
# @method_decorator(login_auth,name='post')
class UserList(views.View):
    # @method_decorator(login_auth)
    def dispatch(self, request, *args, **kwargs):
        obj=super().dispatch(request, *args, **kwargs)
        return obj

    @method_decorator(login_auth)
    def get(self,request):
        return HttpResponse('我是用户列表')

    def post(self,request):
        return HttpResponse('我是用户列表')

 

추천

출처www.cnblogs.com/wangchengpei/p/11041916.html