django拦截器之jwt工具类和登录拦截器

无敌的宇宙
无敌的宇宙
擅长邻域:Java,HTML,JavaScript,MySQL,支付,退款,图片上传

分类: python 标签: django拦截器之jwt工具类

2026-01-31 16:19:55 59浏览

django拦截器之jwt工具类

安装jwt,jwtUtil.py 放到----应用/utils/jwtUtil.py 

pip install PyJWT
import jwt
import datetime
from django.conf import settings

def generate_token(user):
    """
    生成JWT Token
    """
    payload = {
        'user_id': user.id,
        'username': user.username,#这里需要修改成你自己的
        'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=24*30)  # 24小时过期*30天
    }
    token = jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256')
    return token

def verify_token(token):
    """
    验证JWT Token
    """
    try:
        payload = jwt.decode(token, settings.SECRET_KEY, algorithms=['HS256'])
        return payload
    except jwt.ExpiredSignatureError:
        return None  # Token已过期
    except jwt.InvalidTokenError:
        return None  # Token无效

def get_token_from_session(request):
    """
    从Session中获取Token
    """
    return request.session.get('user_token')

def set_token_to_session(request, token):
    """
    将Token设置到Session中
    """
    request.session['user_token'] = token
    # 设置Session过期时间(可选)
    request.session.set_expiry(3600)  # 1小时后过期

登录拦截器

middleware.py  放到应用根目录----应用/middleware.py 
from django.http import JsonResponse
from jf3qApp.utils import jwtUtil

class LoginCheckMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        url=request.path_info
        print("============="+url)

        # 定义不需要登录验证的路径
        exclude_paths = ['/index/', '/static/']

        # 检查当前请求路径是否在排除列表中
        if any(request.path.startswith(path) for path in exclude_paths):
            response = self.get_response(request)
            return response

        #当浏览器发送 HTTP 请求时,请求头的名称是不区分大小写的。
        # 但在 Django 内部处理过程中,为了确保一致性,
        # Django 会将所有请求头名称转换为大写,
        # 并加上 HTTP_ 前缀。这是 Django 请求处理机制的一部分。
        token=request.META.get('HTTP_TOKEN', '')
        # 检查用户是否已登录(通过session判断)        
        if token and jwtUtil.verify_token(token):

            response = self.get_response(request)
            return response

        # 如果未登录,重定向到登录页面
        data={'status':-999,'msg':'账号过期请登录'}
        return JsonResponse(data)

settings.py注册拦截器

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  # 需放在SessionMiddleware之前
    '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',
    'jf3qApp.middleware.LoginCheckMiddleware',   #你的拦截器,注意路径要写对
]

CORS_ALLOW_HEADERS = [
    'content-type',
    # 'authorization',
    'token',#这里要在header里添加你需要的token,和前端的参数保持一致
    # 'x-csrftoken',  # 允许CSRF令牌头
]

使用,登录给前端返回token

def login(request):
    phone=request.POST.get('phone')
    upass=md5Util.calc_md5(request.POST.get('upass'))
    lu=Users.objects.filter(phone=phone,upass=upass).first()
    if lu:
        if lu.state != '1':
            data={'status':0,'msg':'该账号被禁用('+lu.msg+')'}
            return JsonResponse(data)
        lu_d=model_to_dict(lu)
        lu_d['token']=   jwtUtil.generate_token(lu)#给前端返回token
        data={'status':1,'msg':'登陆成功','obj':lu_d }
        return JsonResponse(data)
    else:
        data={'status':0,'msg':'账号或者密码错误'}
        return JsonResponse(data)

如何获取token

def page(request):
    query_data={}
    token=request.META.get('HTTP_TOKEN', '')
    print(token)
    lu=jwtUtil.verify_token(token)
    query_data['user_id']=lu['user_id']

    pageNo=request.POST.get('pageNo')
    pageSize=request.POST.get('pageSize')
    fname=request.POST.get('fname')

    if fname:
        query_data['forum__fname__icontains']=fname
    if user_id:
        query_data['user_id']=user_id
    all=Collect_Forum.objects.select_related('forum').filter(**query_data).all().order_by('-id')
    page_info=pageUtil.getpage(all,page_no=pageNo,page_size=pageSize)
    serializer=Collect_ForumSerializer(page_info['list'],many=True)
    page_info['list']=serializer.data
    data={'status':1,'msg':'操作成功','obj':page_info}
    return JsonResponse(data)

结合系统日志,排除文件参数

 安装 CGI 模块的命令如下:
# pip install legacy-cgi
import cgi


def get_text(data_dict):
    text={}
    for key,value in data_dict.items():
        if isinstance(value,cgi.FieldStorage):
            if value.filename:
                continue
        text[key]=value
    lp=json.dumps(text)
    return lp

好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695