60 django-クッキーとセッションとミドルウェア

A、クッキーとセッション

1.なぜ、これらの技術を持っています

クッキーとセッションは、ユーザーに、クライアントの状態を保存するように見えました。

本質的には、実際には、ため、HTTPプロトコルでは、顧客のログイン情報や状態を保存する方法ステートレスではありませんので、ユーザーのステータスを格納するためのセッションクッキーを使用する必要があります。

クッキー

クッキーは、レコードのユーザ情報へのクライアントのためのコンテナであり、それは、例えば、キーと値のペアの形式で格納されます{'username':'st'}

クッキーがサーバーに送信されると、サーバは、クッキーに運ばユーザーのID情報を識別することができます。最後に知ることができるアクセス・サーバ・アクセス・サーバにジョー・スミスやジョン・ドウです。

ユーザーが使用したときに特定の機能へのこのリードは、サーバーがユーザーのIDを使用することを知らせるためにログインする必要があります。例えば、淘宝網のショッピングカートは、誰もがあなたのショッピングカートにアクセスするために、あなただけ上陸し、異なっています。

あなたが訪問するたびに署名するこのリードユーザー、それは非常に面倒です。あなたが状態を記録するために、一度にログインできる場合は、それは非常に便利です。

クッキーはされて入ってきました。

、ログイン情報をブラウザのクッキーに保存されているユーザーがログインした後、単に次回訪問、一度情報を入力するにはログイン、ブラウザが自動的にクッキーを送信するのに役立ちます。

、手動で何度も入力する必要はありませんユーザー情報というサーバーは、すべてが順調で、光栄!

セッション

すべてが絶対的ではありません。

クッキーのレコード内のユーザー情報は、多くの場合、いくつかの個人情報が含まれています。例えば、パスワードなどの機密情報。

クッキーは、お使いのブラウザに保存されている場合には、クッキー情報は、不慮の漏洩の様々なリスクの対象となります。

漏れたら、災害につながる可能性が高いです。

この問題を解決するために、セッションが判明しました。

ユーザーがログイン情報を入力すると、ユーザー情報は、バックエンドサーバーを通過しているサーバーは暗号化され、データがサーバに格納され、その後、名前の「セッション_」のラベルをラベルされたこの情報を与えます。この「SESSION_IDは、」実際には、ランダムに生成された文字列を見つけるのは簡単で、このユーザ情報をマークするために使用されます。

この「SESSION_ID」を通じて、サーバはこのユーザ情報にすばやくアクセスすることができます。

だから、何を使用ですか?

だから、ブラウザは、ユーザ情報を格納しません。サーバーがブラウザに返す「のsession_id」することができ、ブラウザが保存されているキーと値のペアとしてクッキーの値を「セッション_」します。

このように、ユーザーがアクセスしたい次回は、ブラウザがサーバにクッキーを「SESSION_ID」が挙げられるだろう、着陸前にサーバーに保存されているサーバー最初のユーザ情報が「SESSION_ID」によって発見、サーバはユーザを知ることができますアイデンティティの混乱!

これまでのところ成功上陸!ユーザーは、もはや情報が漏れるの混乱を恐れて、頻繁に情報を入力しないでもありません!

もちろん、セッションは完全ではありませんが、広く宣伝された安全性能が大幅に改善されてきたクッキーと比較した場合にのみ、プログラマは従わなければなりません。

クッキーは、クライアントのブラウザに保存することができますが、それは、サーバによって設定されているため、ブラウザのクッキーは、書き込みを禁止する権利がありますが。

クッキー2.1ジャンゴを設定する方法

私たちは、オブジェクトobjの3つのビューのクッキーベースクラスのインスタンスを提供する必要があります。

obj = HttpResponse()
# 利用obj对象你才可以操作cookie
# obj = render()
# obj = redirect()

obj.set_cookie('k1','v1')
# 设置用盐加密的cookie
obj.set_signed_cookie(key,value,salt='加密盐',)

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'st' and password == '123':
            # 如果登录信息完整,就返回主页
            obj = redirect('/home/')
            
           # 告诉浏览器,保存这一对cookie
            obj.set_cookie('username','st')
            
            return obj
    return render(request,'login.html')

2.2ジャンゴクッキーを取得する方法

def home(request):
    if request.COOKIES.get('username'):
        print(request.COOKIES.get('username'))
        # st
        return HttpResponse('只有登录的人才能看到')
    return redirect('/login/')

2.3クッキーのタイムアウトを設定する方法ジャンゴ

set_cookies使用max_ageの、パラメータを満了します

obj.set_cookie('k1','v1',max_age=3)
obj.set_cookie('k1','v1',expires=3)
# 两个参数都是设置超时时间  并且都是以秒为单位
# 区别:expires可以给IE浏览器设置cookie的超时时间

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'st' and password == '123':
            obj = redirect('/home/')
            obj.set_cookie('username','st',expires=3)
            # 告诉浏览器,保存这一对cookie
            # expires=3单位为秒,max_age一样
            return obj
    return render(request,'login.html')

Djangoはどのページにジャンプする2.4あなたはクッキーを通してアクセスしたいです

ログイン認証はデコレータで行うことができます

# 用来跳回用户登录前想访问的页面的装饰器
from functools import wraps
def login_auth(func):
    @wraps(func)
    def inner(*args,**kwargs):
        # 判断当前用户是否登录
        request = args[0]
        # print(request)
        # print(request.GET)
        # print(request.path_info)  # 只获取url,不获取get参数
        # print(request.get_full_path())  # # url+get参数
        if request.COOKIES.get('username'):
            res = func(*args, **kwargs)
            return res
        else:
            # 获取到用户想要访问的页面的url
            path = request.path_info
            # 将该url当做get参数传入login函数
            return redirect(f'/login/?path={path}')
    return inner


# login
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'st' and password == '123':
            # 获取get参数,取得用户想要访问的url
            path = request.GET.get('path')
            if path:
                obj = redirect(path)
            else:
                # 如果path没值,可能用户是直接访问的login视图,因此登录后默认返回到home首页
                obj = redirect('/home/')

            obj.set_cookie('username','st')
            return obj
    return render(request,'login.html')

クッキー2.5ジャンゴを削除する方法

することによりdelete_cookie、クッキーの機能を削除します。

def logout(request):
    obj = redirect('/logout/')
    obj.delete_cookie('username')
    return obj

3.セッション

セッションは、サーバー側のペアに格納されます。

セッションの作業メカニズムは、クッキーに依存する必要があります。

3.1 Djangoの設定セッション

二週間、14日間のデフォルトの有効期限

def set_session(request):
    request.session['k1'] = 'ok123'
    return HttpResponse('session已设置')

何が終わり内部ジャンゴで起こりました:

  1. 取得したデータは、大きな辞書にキーと値のペアの形で添加され、辞書を暗号化して格納されます。
  2. SESSION_IDは、前のステップで得られたデータを暗号化して自動的に、ランダムな文字列を生成します。リザーバ内に格納された暗号化データの形:キーと値のペア{「SESSION_ID」}で。暗号化されたデータに対応するのsession_idによって取得することができます。
  3. SESSION_IDは、フロントエンドのブラウザに戻ります。次は、アクセスにブラウザのクッキーを運ぶためにして、バックエンドサーバーを使用すると、SESSION_IDによってリザーバ内に格納された暗号化されたデータへのアクセスを得ることができるように、クッキーSESSION_IDを得ることができます。暗号化されたデータを復号化する復号化アルゴリズムに対応し、「暗号化されたデータを暗号化する際に暗号化アルゴリズムを使用」、鍵が格納されたデータの形式で取得することができます。
  4. 、Djangoは自動的に対応するブラウザの辞書、新しいキー値ペアを復号化しながら、プライベートデータのセットを格納するための次回同じブラウザのニーズは、この大規模な辞書に加え、再暗号化され、記憶され、代わりに前のものです暗号化の辞書には、ブラウザはデータの唯一の作品となりますので、ということ。

3.2ジャンゴ収集セッション

# 获取session
def get_session(request):
    res = request.session.get('k1')
    print(res)
    return HttpResponse('获取成功')

何が終わり内部ジャンゴで起こりました:

  1. Djangoのサーバーは、ブラウザのクッキーにフロントオフィスから取得します
  2. クッキーから対応する「SESSION_ID」の値を取得
  3. SESSION_IDてデータベースに暗号化された値の対応を求める辞書
  4. 暗号化と復号化の辞書には、大規模な辞書を取得します
  5. ますrequest.session =大辞典
  6. ますrequest.sessionはその後で辞書から仕方値を「に.get」することができます。
res = dict(request.session)
print(res)

# 强制类型转换一下,发现确实是一个字典
# {'k1': 'ok123', 'k2': 'ok321'}

3.3ジャンゴ削除セッション

# 删除session
def del_session(request):
    
    # 删除当前会话的所有Session数据
    # request.session.delete()
    
    # 删除当前的会话数据并删除会话的Cookie,
    # 用于确保前面的会话数据不可以再次被用户的浏览器访问.建议使用
    request.session.flush()
    return HttpResponse('shanle ')

3.4 Djangoがセッションの有効期限を設定します

# request.session.set_expiry(value)
request.session.set_expiry(5)  # 单位为秒

ストリップセッションが失敗した場合、有効なデータがセッションに個別のデータテーブルとして大辞典アウトから上映されます、それはすぐに明らかではないが、最初のセッションリストの存在、時間の期間にわたって各、ジャンゴ自動クリーンアップが有効になり、セッション時間の障害が経過したが削除されました。

3.5 Djangoがセッションを格納するためのメモリを設定します

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,默认修改之后才保存(默认)

Django中Session相关设置

二、Djangoのミドルウェア

1.デフォルトミドルウェア

あなたは、サイトの全体的な機能のいくつかをしたい場合は、ジャンゴミドルウェアを使用するように優先順位を与える必要があります。

例えば:

1.グローバルユーザログイン認証
、ユーザアクセスの検証の全体的な周波数2.
3.グローバルなユーザー権限は、(チェック)

最も完璧を行うには、すべてのあるミドルウェアフレームワークをジャンゴ。

# settings
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',
]

これらは、7デフォルトのDjangoのミドルウェアです。

ミドルウェアの性質は、次の方法のクラスは、特定の段階で自動的にトリガされますが、実際にクラスのいずれかです。

1.process_request

2.process_response

3.process_view

4.process_template_response

5.process_exception

2.カスタムミドルウェア

簡単に取ることができPYファイル名を作成し、そのファイルをインポートするカスタムミドルウェアの必要性MiddlewareMixinモジュールは、サブクラスを生成します。

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,render,redirect
# 接下来可以定义类,继承MiddlewareMixin模块,该类就成为了一个中间件

class MyMdd1(MiddlewareMixin):
    def process_request(self,request):
        pass
    
# 。。。。。。

2.1。知っておく必要があります

  1. process一

    要求が上から下にされるときに1、順次構成ファイルで定義された内部設定に従って各中間process一方法のために行われます。

    2.ない内部中間法場合は、次の中間の実行をスキップします。

    3.リターンHttpResponseオブジェクト一度方法、その要求はすぐに停止直後にバックトラック戻ります。

    私たちは、現在のprocess_respone process一方式戻ったHttpResponseオブジェクトの後、中間4の内部から直接戻ります。バックトラック。ミドルウェアはもはや実行しません実行されません。

def process_request(self,request):
    print('我是第一个中间件里面的process_request方法')
    # return HttpResponse("我是中间件一里面的")
  1. process_response

    1.応答は、下から順に、構成ファイルに従って、各ブローカ内で定義された方法を順次実行process_responseを時間の設定を行います。

    2.この方法は、2つのパラメータ、パラメータを持っている必要がありますし、応答が直接与え返されません返さなければなりません。

    前記方法が何も返さない(HttpResponsedオブジェクト)を得ることができるもののフロントエンド。

def process_response(self,request,response):
    """
    :param request:
    :param response: 就是后端返回给前端的数据
    :return:
    """
    print('我是第一个中间件里面的process_response方法')
    return response

2.2の概要

  1. process_view

    トリガー成功一致ルーティング後ビュー機能1を実行する前に。

    2.方法復帰HttpResponseオブジェクト場合、内部process_response法から各ブローカ後に再びあろう。

def process_view(self,request,view_name,*args,**kwargs):
    print(view_name)  # 函数内存地址
    print(args)
    print(kwargs)
    print('我是第一个中间件里面的process_view方法')
  1. process_template_response

    1.ビュー機能は、実行が即座に完了した後に実行されるが、関数の戻りが表示オブジェクトがレンダリング()メソッド(またはターゲット・オブジェクトがTemplateResponseまたは同等の方法であることを示す)を有していなければならないという前提があるれています。またはトリガされません。

def process_template_response(self, request, response):
    print('我是第一个中间件里面的奇葩方法')
    return response


# views
def mdzz(request):
    print('我是视图函数mdzz')
    def render():
        return HttpResponse('你好呀 我是奇葩')
    obj = HttpResponse('我很好 好的像个傻逼一样')
    obj.render = render
    return obj
  1. process_exception

    1.エラーがビュー関数を発生した場合、順序は下から一番上にある自動的にトリガ

def process_exception(self,request,exception):
    print('我是第一个中间件里面的process_exception')
    print(exception)

おすすめ

転載: www.cnblogs.com/bowendown/p/11986507.html