Django去访问web api接口Object of type Session is not JSON serializable
2023-12-13 15:01:23
Django去访问一个web api接口,两次连接之间需要通过Session()保持身份验证。
尝试用
def sendCode(request):
mobile =json.loads(request.body).get("Mobile")
http = requests.Session()
result = http.get(f'http://127.0.0.1:8000/api/login?mobile={mobile}&func=send_code')
request.session['http'] = http
request.session['httpMobile'] = mobile
return result
def verifyCode(request):
code =json.loads(request.body).get("code")
mobile = request.session.get('httpMobile')
http = request.session.get('http')
result = http.get(f'http://127.0.0.1:8000/api/login?mobile={mobile}&func=verify_code&code={code}')
return result
提示:Object of type Session is not JSON serializable
原因:requests.Session()
对象无法直接存储在 Django 的 session 中。Django 的 session 只支持可序列化的数据类型,而 requests.Session()
不是可序列化的。
网上解决这个问题的方案通常是建议把requests.Session()的状态序列化为可存储的字典 或通过第三方库。感觉都停麻烦的。
我的解决方案是用自定义类对象的成员存储Session()对象,request.session存储自定义类对象,这样request.session只存储了Session()对象的指针,就不需要用对Session()对象序列化了。
class LoginOwner():
def __init__(self, mobile):
self.http = requests.Session()
self.mobile = mobile
def sendCode(self,):
return self.http.get(f'http://127.0.0.1:8000/api/login?mobile={self.mobile}&func=send_sms')
def verifyCode(self,smscode):
return self.http.get( f'http://127.0.0.1:8000/api/login?mobile={self.mobile}&func=verify_sms&smscode={smscode}')
def sendCode(request):
mobile =json.loads(request.body).get("Mobile")
owner = LoginOwner(mobile)
request.session["owner"] = owner
return owner.sendCode()
def verifyCode(request):
code =json.loads(request.body).get("code")
owner= request.session.get('owner')
return owner.verifyCode(code)
文章来源:https://blog.csdn.net/bigcarp/article/details/134969934
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!