2014-11-21 72 views
1

我是python的新手,並試圖使用ast.literal_eval來獲取請求數據,導致「無效語法」錯誤。使用ast.literal_eval錯誤的Python請求語法無效?

它打印數據我送這是格式一樣,

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'] 

無效的語法錯誤= ast.literal_eval(數據)

如何解決它的建議將是可觀的

由於

+0

這dosent看起來像蟒蛇表達式 – Hackaholic 2014-11-21 07:05:22

+0

@Hackaholic它是python服務的一部分,我在我提到的錯誤的一部分。 – user3664724 2014-11-21 07:07:35

+0

'192.156.1.0,8181,database,admin,12345'不是python表達式 – Hackaholic 2014-11-21 07:08:26

回答

3

變化這樣的:

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(',')))) 
+0

192.156.1.0,8181,數據庫,管理員,12345正在從http POST來如何將其更改爲字符串。 – user3664724 2014-11-21 07:20:37

+0

@ user3664724檢查編輯:) – Hackaholic 2014-11-21 07:23:43

+0

好吧,讓我檢查 – user3664724 2014-11-21 07:33:49

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' 
+0

不能這樣做任何人可以注入惡意代碼 – Hackaholic 2014-11-21 07:14:13

+0

192.156.1.0,8181,數據庫,管理員,12345從http POST commin如何將其轉換爲字符串? – user3664724 2014-11-21 07:21:11

+0

'str(request.body.read())'會做。和你的代碼一樣。請參閱'print'語句 – nu11p01n73R 2014-11-21 07:23:11