Python请求使用ast.literal_eval时出现错误"Invalid syntax"?

4

我是一名初学者,正在尝试使用ast.literal_eval获取请求数据,但出现了“无效语法”错误。

它会打印我发送的数据,其格式如下:

192.156.1.0,8181,database,admin,12345

在 Python 中我可以显示它,但读取时却出现了错误,我的代码如下:
    print str(request.body.read())
    datas = request.body.read()
    data=ast.literal_eval(datas)
    dbname = data['dbname']
    username = data['uname']
    ip = data['ip']
    port = data['port']
    pwd = data['pwd']

data=ast.literal_eval(datas)行代码出现了语法错误

建议如何解决此问题,将不胜感激

谢谢


这看起来不像是Python表达式。 - Hackaholic
@Hackaholic 这是 Python 服务的一部分,我在提到的那行代码出现了错误。 - user3664724
192.156.1.0,8181,database,admin,12345 不是 Python 表达式。 - Hackaholic
打印请求体中的字符串:print str(request.body.read()),代码中的打印行为您提到的那一行。 - user3664724
你尝试过不要调用 read 两次吗?如果 request.body 是一个类似文件的对象,read 不是一个纯函数;调用它两次会在第二次调用时给你一个空字符串。 - user2357112
2个回答

7

改变这个:

192.156.1.0,8181,database,admin,12345

转换为:

>>> a = "['192.156.1.0',8181,'database','admin',12345]"
>>> ast.literal_eval(a)
['192.156.1.0', 8181, 'database', 'admin', 12345]

ast.literal_eval

ast.literal_eval(node_or_string)
安全地评估一个表达式节点或一个包含Python文字或容器显示的Unicode或Latin-1编码字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和 None。

这可以用于安全地评估来自不可信来源的包含 Python 值的字符串,而无需自己解析这些值。它无法评估任意复杂的表达式,例如涉及运算符或索引的表达式。

您可以尝试这样做:

>>> a='192.156.1.0,8181,database,admin,12345'
>>> a = str(map(str,a.split(',')))
>>> a
"['192.156.1.0', '8181', 'database', 'admin', '12345']"
>>> ast.literal_eval(a)
['192.156.1.0', '8181', 'database', 'admin', '12345']

你的代码将会是这样的:

data=ast.literal_eval(str(map(str,datas.split(','))))

192.156.1.0,8181,database,admin,12345 是通过 HTTP POST 发送的,如何将其转换为字符串。 - user3664724

2

那么像这样的内容怎么样?

dbname, username, ip, port, pwd = request.body.read().split(',')

测试

>>> str = "192.156.1.0,8181,database,admin,12345"
>>> dbname , username , ip, port ,pwd = str.split(',')
>>> dbname
'192.156.1.0'
>>> username
'8181'
>>> ip
'database'
>>> port
'admin'
>>> pwd
'12345'

不能这样做,任何人都可以注入恶意代码。 - Hackaholic
192.156.1.0,8181,数据库,管理员,12345 通过HTTP POST发送,如何将其转换为字符串? - user3664724
str(request.body.read()) 将会执行,与您的代码相同。请查看 print 语句。 - nu11p01n73R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接