Django 登录接口,返回token
完成login之后返回token的接口,包括生成token,form校验,连接redis,view逻辑
1,在该子项目下新建utils.py ,存放生成token的类
from django_redis import get_redis_connection
import itsdangerous
# 获取/解析token用到的模块
from django.conf import settings
# 把settings中的一串字符串作为 secretkey
from .const import token_expires
class Token:
# 获取/解析token的类
tjss = itsdangerous.TimedJSONWebSignatureSerializer(settings.SECRET_KEY, expires_in=token_expires)
# 把settings中的一串字符串作为 secretkey
# 设置一个失效时间
@classmethod
def create_token(cls,data):
token=cls.tjss.dumps(data).decode()
# data是根据什么获取的token,比如根据用户的用户名和密码
return token
@classmethod
def check_token(cls,token):
try:
data=cls.tjss.loads(token)
# 解析传过来的token,比如,解析成用户的用户名和密码
except:
# 如果解析失败的话。程序会报错。所以这里加了异常处理,如果解析失败,返回false即可
return False
return data2,form校验
class LoginForm(forms.Form,FormatFormError):
# login form
# 校验,1,传入的参数username和password数据类型是否合法
# 2,username和password在sqlite数据库中能否查到,登录的信息是否正确
username=forms.CharField(max_length=50)
password=forms.CharField(max_length=50)
def clean(self):
username=self.cleaned_data.get(‘username‘)
password=self.cleaned_data.get(‘password‘)
# 获取传到form中的参数 字典类型
u=models.User.objects.filter(username=username,password=password).first()
# 去数据表中查找这条数据
if u:
self.cleaned_data[‘u‘]=u
print(self.cleaned_data)
# 如果查到了,表明用户信息合法,并且把这条Model信息存到cleandata中
else:
raise ValidationError(‘账号/密码错误!‘)
# 如果查不到,直接报异常,用户信息校验失败3,views
class LoginView(View):
‘‘‘loginview‘‘‘
def get(self,request):
# 现在要做的登录返回token是get请求
form=LoginForm(request.GET)
# 把请求参数传给form,实例化form
if form.is_valid():
id=form.cleaned_data.get(‘u‘).id
username=form.cleaned_data.get(‘u‘).username
# 如果校验通过,想取到这条model的id和name拼接成字典,作为加密的原始数据
data={‘id‘:id,‘username‘:username}
token=Token.create_token(data)
# 生成token
r=get_redis_connection()
# 建立redis的连接
key=session_pre+username
# redis中的key统一成,session:username的格式
r.set(key,token,token_expires)
# r.set(key,token)
return Nbreponse(username=username,token=token)
# 请求成功,就返回token给用户
else:
return Nbreponse(-1,form.error_msg) 相关推荐
qidiantianxia 2020-10-21
wolfjin 2020-09-10
HMHYY 2020-06-28
苦咖啡flask 2020-06-18
playis 2020-06-16
xuanwenchao 2020-06-14
sqliang 2020-06-14
TesterJingel 2020-06-10
RocketJ 2020-06-09
powderhose 2020-06-08
rongxionga 2020-06-08
Burgesszheng 2020-06-07
huangyx 2020-05-29
RuoShangM 2020-05-14
数据库之扑朔迷离 2020-05-06