django拦截器之jwt工具类和登录拦截器
分类: 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)展开评论
暂无评论,快来写一下吧
展开评论
他的专栏
他感兴趣的技术


java
vue
springboot
Mysql
ssm
小程序
uniapp
js和jquery