2017-03-30 3 views
1

Je m'excuse si les titres sont trop vagues.PyMel - urllib2 400 Bad Demande lors de l'appel de la fonction

Dans Maya (PyMel) im appeler une fonction ci-dessous pour dessiner un écran de connexion

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)) 

En cliquant sur le bouton de connexion puis appelle ms.ms_login et transmet les valeurs du nom d'utilisateur et mot de passe à la fonction

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 

Cependant, je suis obtenir l'erreur suivante

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 # 

maintenant, Je sais ce qu'est une mauvaise demande 400, mais je ne comprends pas pourquoi je reçois un. L'exécution de cette fonction seule dans une console maya me donne les résultats que je veux, cela ne semble être que lorsqu'on appelle la fonction avec lambda ou partial.

N'a pas pu trouver vraiment une solution lors de la recherche (et je me excuse, jamais vraiment utilisé urllib avant)

Tout conseil serait apprécié, merci!

Répondre

0

Essayez la version suivante:

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 

enter image description here