PyMel - urllib2 400 Bad Request при вызове из функции
Я извиняюсь, если названия слишком расплывчаты.
В Maya (PyMel) я вызываю функцию ниже, чтобы нарисовать экран входа
def ms_ui(self):
logged_in = False
if not logged_in:
login_col = pm.rowColumnLayout(numberOfColumns=3)
usr = pm.textField(text="username")
usr_val = pm.textField(usr, text=True, q=True)
pwd = pm.textField(text="Password")
pwd_val = pm.textField(pwd, text=True, q=True)
pm.button(label="Log in!", c=lambda x: ms.ms_login(usr_val, pwd_val))
Нажатие на кнопку входа в систему вызывает ms.ms_login и передает значения имени пользователя и пароля в функцию.
def ms_login(user, passwd):
import urllib2, base64, json
username = user
password = passwd
param = {"secret": "thesecretgoeshere"}
url = "https://someurl/api/token"
base64string = base64.b64encode('%s:%s' % (username, password))
req = urllib2.Request(url,
headers = {
"Authorization": "Basic %s" % base64string,
"Content-Type": "application/json"
})
f = urllib2.urlopen(req, json.dumps(param))
data = f.read()
print data
Однако я получаю следующую ошибку
Error: HTTP Error 400: Bad Request
Traceback (most recent call last):
File "C:\Program Files\Autodesk\Maya2017\Python\lib\site-packages\pymel\internal\factories.py", line 785, in callback
res = origCallback(*newargs)
File "D:/Documents/maya/2017/scripts\MMB\MMB.py", line 223, in <lambda>
pm.button(label="Log in!", c=lambda x: ms.ms_login(usr_val, pwd_val))
File "D:/Documents/maya/2017/scripts\MMB\ms.py", line 13, in ms_login
f = urllib2.urlopen(req, json.dumps(param))
File "C:\Program Files\Autodesk\Maya2017\bin\python27.zip\urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "C:\Program Files\Autodesk\Maya2017\bin\python27.zip\urllib2.py", line 437, in open
response = meth(req, response)
File "C:\Program Files\Autodesk\Maya2017\bin\python27.zip\urllib2.py", line 550, in http_response
'http', request, response, code, msg, hdrs)
File "C:\Program Files\Autodesk\Maya2017\bin\python27.zip\urllib2.py", line 475, in error
return self._call_chain(*args)
File "C:\Program Files\Autodesk\Maya2017\bin\python27.zip\urllib2.py", line 409, in _call_chain
result = func(*args)
File "C:\Program Files\Autodesk\Maya2017\bin\python27.zip\urllib2.py", line 558, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 400: Bad Request #
Теперь я знаю, что такое 400 плохих запросов, но я не понимаю, почему я их получаю. Выполнение этой функции самостоятельно в консоли Maya дает мне желаемые результаты, это только при вызове функции с лямбда или частичной.
Не могу найти решение при поиске (и я извиняюсь, никогда прежде не использовал urllib)
Любой совет будет оценен, спасибо!
1 ответ
Попробуйте следующую версию:
import pymel.core as pm
import urllib2, base64, json
window = pm.window( title="Login Window", iconName='Login Window', widthHeight=(320,30) )
login_col = pm.rowColumnLayout( numberOfColumns=3 )
usr = pm.textField( text="username" )
usr_val = pm.textField( usr, text=True, q=True )
pwd = pm.textField( text="password" )
pwd_val = pm.textField( pwd, text=True, q=True )
pm.button( label="Log in!", command=('pm.deleteUI(\"' + window + '\", window=True)') )
pm.setParent( '..' )
pm.showWindow( window )
def ms_ui(self):
logged_in = False
if not logged_in:
pm.button( c=lambda x: ms.ms_login(usr_val, pwd_val) )
def ms_login(user, passwd):
username = user
password = passwd
param = {"secret": "thesecretgoeshere"}
url = "https://someurl/api/token"
base64string = base64.b64encode('%s:%s' % (username, password))
req = urllib2.Request(url,
headers = {
"Authorization": "Basic %s" % base64string,
"Content-Type": "application/json"
})
f = urllib2.urlopen( req, json.dumps(param) )
data = f.read()
print data