【问题标题】:Python request using ast.literal_eval error Invalid syntax?Python 请求使用 ast.literal_eval 错误语法无效?
【发布时间】:2015-01-19 06:32:00
【问题描述】:

我是 python 新手,尝试使用 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 它是 python 服务的一部分,我在我提到的行中遇到了错误。
  • 192.156.1.0,8181,database,admin,12345 不是 python 表达式
  • print str(request.body.read()) 你上面提到的代码打印行。
  • 你有没有试过不给read打电话两次?如果request.body 是一个类文件对象,那么read 就不是一个纯函数;调用它两次会在第二次调用时给你一个空字符串。

标签: python json parsing http httprequest


【解决方案1】:

改变这个:

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)

Safely evaluate an expression node or a Unicode or Latin-1 encoded string containing
a Python literal or container display. The string or node provided may only consist of 
the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None.

 This can be used for safely evaluating strings containing Python values from untrusted 
sources without the need to parse the values oneself. It is not capable of evaluating 

任意复杂的表达式,例如涉及运算符或索引。

你可以这样试试:

>>> 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 如何将其更改为字符串。
【解决方案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'

【讨论】:

  • 不能这样任何人都可以注入恶意代码
  • 192.156.1.0,8181,database,admin,12345 commin from http POST 如何转换成字符串?
  • str(request.body.read()) 可以。和你的代码一样。请参阅print 声明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多