如何解决ValueError:int() 的无效文字,基数为 10:'' 在 Flask 应用程序中使用 cookie
从 cookies.get()
方法检索计数值时遇到问题。虽然我尝试使用类型转换为
count=int(request.cookies.get('cou',0))
得到 ValueError: invalid literal for int() with base 10: ''
。
from flask import Flask,request,make_response
app=Flask(__name__)
@app.route('/set/')
def s():
msg='successfully set the cookie'
res=make_response(msg)
res.set_cookie('cou')
return res
@app.route('/get/')
def g():
count=request.cookies.get('cou',0)
count+=1
return 'visited this {} times'.format(str(count))
if __name__=='__main__':
app.run(host='127.0.0.1',port=8000)
输出:
return self.view_functions[rule.endpoint](**req.view_args)
File "main.py",line 18,in g
count+=1
TypeError: must be str,not int
127.0.0.1 - - [16/Jan/2021 22:08:56] "GET /get/ HTTP/1.1" 500 -
我使用的是 Python 3.6.8。
解决方法
低碳水化合物介绍
如果您在 python 控制台中输入 int('')
:
>>> int('')
你会观察到这样的“结果”:
Traceback (most recent call last):
File "<pyshell#10>",line 1,in <module>
int('')
ValueError: invalid literal for int() with base 10: ''
即使您不知道实际代码,您也可以猜测是哪个函数调用导致了这种情况。换句话说,对于错误分析,仔细阅读错误消息(并读到最后)确实值得。
饼干的盛宴
您面临的问题是 request.cookies.get('cou',0)
返回的值实际上 属于 str
类型。它是 ''
,因此无法转换为有效的 base-10 int
,您传递给 dict.get(key[,default]) 的 default
对查找无效因为已找到密钥 cou
。
您实际上是通过隐式使用 response.set_cookie(key,value='',[...]) 的参数 ''
的默认参数[1] 将 cookie 设置为值 value
通过将 res.set_cookie('cou')
替换为 res.set_cookie('cou',0)
,您将把所描述的问题抛在脑后。
进一步阅读:
- Get and set cookies with Flask - Python Tutorial
- http.cookies — HTTP state management — Python 3.9.1 documentation
输出中显示的问题
这可能会重复 Python TypeError must be str not int 中显示的问题,并告诉我您使用的是 Python 3.7 之前的一些。基本上是您读取了上面的空字符串(如上所述)并尝试将一个整数连接到它。由于 Python 没有为这里提供自动转换(因为 s+str(1)
和 int(s)+1
之间的歧义),它拒绝通过
TypeError: must be str,not int
在 Python 3.6 或 Python 3.7+ 中通过
TypeError: can only concatenate str (not "int") to str
[1] 参见 Python3 文档,6.3.4. Calls:
“处理完所有参数后,仍然未填充的槽将用函数定义中的相应默认值填充。”
待更新
超出实际问题范围的提示
您仍然忘记的是将更新后的值写回,count
本身只是一个 int
。增加它没有任何魔法,因此您曾经存储的 cookie 会保持其原始值 (0
),而您显示的是该值加 1。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。