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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。