最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django token 生成與驗證的實現(xiàn)

 更新時間:2025年04月08日 09:55:34   作者:衛(wèi)龍~  
本文主要介紹了Django token 生成與驗證的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

首先創(chuàng)建一個Django 項目,我這里以 demo為例,作為示例先不創(chuàng)建app了

 然后再 demo 目錄下創(chuàng)建 views.py 和 utils 目錄,在目錄下分別創(chuàng)建 token.py ,middleware.py ,__init__.py,然后目錄格式如下圖

接下來完成views.py 和 token.py 和 middleware.py 中的內(nèi)容了,首先是 token.py

import time
import hashlib
from demo import settings
from django.core import signing
from datetime import datetime, timedelta

HEADER = {'typ': 'JWP', 'alg': 'default'}
KEY = settings.SECRET_KEY
SALT = "ESS"

def encrypt(obj):
    """加密: signing 加密 and Base64 編碼"""
    value = signing.dumps(obj, key=KEY, salt=SALT)
    value = signing.b64_encode(value.encode()).decode()
    return value

def decrypt(src):
    """解密: Base64 解碼 and signing 解密"""
    src = signing.b64_decode(src.encode()).decode()
    raw = signing.loads(src, key=KEY, salt=SALT)
    return raw

def create_token(username):
    """生成token信息"""
    # 1. 加密頭信息
    header = encrypt(HEADER)
    # 2. 構造Payload(有效期31天)
    payload = {
        "username": username, 
        "iat": time.time(), 
        "exp": (datetime.utcnow() + timedelta(hours=8,days=31)).strftime("%Y-%m-%d")
        }
    payload = encrypt(payload)
    # 3. MD5 生成簽名
    md5 = hashlib.md5()
    md5.update(("%s.%s" % (header, payload)).encode())
    signature = md5.hexdigest()
    token = "%s.%s.%s" % (header, payload, signature)
    return token

def get_payload(token):
    """解析 token 獲取 payload 數(shù)據(jù)"""
    payload = str(token).split('.')[1]
    payload = decrypt(payload)
    return payload

def get_username(token):
    """解析 token 獲取 username"""
    payload = get_payload(token)
    return payload['username']

def get_exp_time(token):
    """解析 token 獲取過期時間"""
    payload = get_payload(token)
    return payload['exp']

def check_token(username, token):
    """驗證 token: 檢查 username 和 token 是否一致且未過期"""
    return get_username(token) == username and get_exp_time(token) > (datetime.utcnow() + timedelta(hours=8)).strftime('%Y-%m-%d')

接著是 middleware.py 文件,記得配置 路由白名單,即不需要驗證 token 的路由

from .token import check_token
from django.http import JsonResponse

try:
    from django.utils.deprecation import MiddlewareMixin  # Django 1.10.x
except ImportError:
    MiddlewareMixin = object

# 白名單,表示請求里面的路由時不驗證登錄信息
API_WHITELIST = ['/index/', '/index', 'index/']


class AuthorizeMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print(request.path)
        print(request.path not in API_WHITELIST)
        if request.path not in API_WHITELIST:
            if "sites" in request.path:
                pass
            else:
                # 從請求頭中獲取 username 和 token
                username = request.META.get("HTTP_USERNAME")
                token = request.META.get("HTTP_AUTHORIZATION")
                if username is None or token is None:
                    return JsonResponse({"code": -2, "msg": "未查詢到登錄信息"})
                else:
                    # 調(diào)用 check_token 函數(shù)驗證
                    if check_token(username, token):
                        pass
                    else:
                        return JsonResponse({"code": -2, "msg": "登錄信息錯誤或已過期"})

接著是 views.py

from django.http import JsonResponse
from demo.utils.token import create_token

def index(request):
    return JsonResponse({'code': 0, 'message': 'Hello, world!'})

 接著是 url.py,需要設置一下請求路徑

from django.urls import path
from demo import views

urlpatterns = [
    path('index/', views.index),
]

接著再 settings.py 文件中 設置我們的中間件,這樣每次請求都會先校驗 token 了

MIDDLEWARE = [
    'demo.utils.middleware.AuthorizeMiddleware', # 一定要放在最上面,有cors的話放cors下面
    '···',
]

 到這為止 就已經(jīng)完成了所有的配置,下面圖1 和圖2分別是 設置和沒設置請求路徑白名單的效果

圖1 - 沒有設置路由白名單

圖2 - 設置了路由白名單

相關文章

  • 淺談Python中的繼承

    淺談Python中的繼承

    這篇文章主要介紹了Python中繼承的的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • Python 實現(xiàn)定積分與二重定積分的操作

    Python 實現(xiàn)定積分與二重定積分的操作

    這篇文章主要介紹了Python 實現(xiàn)定積分與二重定積分的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 如何使用python的subprocess執(zhí)行命令、交互、等待、是否結(jié)束及解析JSON結(jié)果

    如何使用python的subprocess執(zhí)行命令、交互、等待、是否結(jié)束及解析JSON結(jié)果

    這篇文章主要給大家介紹了關于如何使用python的subprocess執(zhí)行命令、交互、等待、是否結(jié)束及解析JSON結(jié)果的相關資料,subprocess模塊提供了一種簡單的方法來創(chuàng)建和管理子進程,它可以讓我們在Python程序中執(zhí)行外部命令,獲取命令的輸出和錯誤信息,需要的朋友可以參考下
    2023-12-12
  • Python特效之數(shù)字成像方法詳解

    Python特效之數(shù)字成像方法詳解

    所謂數(shù)字成像,即將原圖片經(jīng)過python處理后,生成完全由純數(shù)字組成的圖像。本文將具體為大家介紹一下這一效果如何實現(xiàn),需要的可以參考一下
    2022-01-01
  • pytorch GAN生成對抗網(wǎng)絡實例

    pytorch GAN生成對抗網(wǎng)絡實例

    今天小編就為大家分享一篇pytorch GAN生成對抗網(wǎng)絡實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python字符串基礎操作詳解

    python字符串基礎操作詳解

    這篇文章主要為大家詳細介紹了python字符串基礎操作,,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 一篇文章帶你了解谷歌這些大廠是怎么寫 python 代碼的

    一篇文章帶你了解谷歌這些大廠是怎么寫 python 代碼的

    這篇文章主要介紹了谷歌這些大廠怎么寫python代碼,我們寫代碼,往往還是按照其它語言的思維習慣來寫,那樣的寫法不僅運行速度慢,代碼讀起來也費盡,給人一種拖泥帶水的感覺,需要的朋友可以參考下
    2021-09-09
  • 如何利用Python給自己的頭像加一個小國旗(小月餅)

    如何利用Python給自己的頭像加一個小國旗(小月餅)

    這篇文章主要給大家介紹了關于如何利用Python給自己的頭像加一個小國旗(小月餅)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • 在Python中存儲字符串

    在Python中存儲字符串

    這篇文章主要介紹了在Python中存儲字符串,文章通過unicode展開主題相關內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • Python實現(xiàn)批量生成,重命名和刪除word文件

    Python實現(xiàn)批量生成,重命名和刪除word文件

    這篇文章主要為大家詳細介紹了Python如何利用第三方庫實現(xiàn)批量生成、重命名和刪除word文件的功能,文中的示例代碼講解詳細,需要的可以參考一下
    2023-03-03

最新評論

永寿县| 江西省| 滦平县| 广东省| 盈江县| 柞水县| 诏安县| 增城市| 福安市| 宝应县| 白河县| 泗阳县| 丹寨县| 桃园市| 四子王旗| 定兴县| 清水河县| 清远市| 马公市| 漯河市| 含山县| 泰和县| 武陟县| 连江县| 贵德县| 忻城县| 孟州市| 维西| 寿光市| 西吉县| 江永县| 政和县| 友谊县| 抚顺市| 金川县| 孟村| 漳平市| 饶河县| 米林县| 凌云县| 乌恰县|