Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Publicaciones sobre programming (publicaciones antiguas, página 49)

Juno y middleware

init({
    'middleware':[('paste.auth.basic.AuthBasicHandler',
                      {'realm':'Admin',
                       'authfunc':valid_user})],
    })

Don­de va­li­d_u­ser es la fun­ción ob­via que to­ma usua­rio­/­pa­ssword y de­vuel­ve True/­Fal­se.

No es exac­ta­men­te una co­sa so­fis­ti­ca­da con ro­le­s, pe­ro no ne­ce­si­to eso pa­ra my apli­ca­ción (los con­tro­les de ac­ce­so de LDAP se en­car­gan).

Pyjamas y Juno

Así que, que miérco­le­s, apren­da­mos al­go mien­tras tan­to. Las víc­ti­ma­s: Py­ja­mas y Juno.

Py­ja­mas es una ver­sión Py­thon de GWT y es una ben­di­ció­n: fi­nal­men­te pue­do es­cri­bir HT­ML y JS en py­thon ;-)

Y Juno es re­fres­cante­men­te sim­ple. Ya que to­do el fron­tend es­tá he­cho en Py­ja­ma­s, lo úni­co que ne­ce­si­to es una ma­ne­ra de rou­tear lla­ma­das JSONRPC a có­di­go py­thon y ope­rar en el ba­cken­d.

Así que acá hay dos frag­men­tos úti­le­s:

# This decorator decodes JSONRPC arguments as sent by Pyjamas to
# Juno, and calls the target function with the decoded version.
def JSONRemote(target):
    def wrapper(web,*args,**kwargs):
        postdata=web.input().keys()[0]
        data = json.loads(postdata)
        id, method, params = data["id"],data["method"],[web,]+data["params"][1]
      kwargs['method']=method
        return target(*params,**kwargs)
    return wrapper

usan­do es­to, cual­quier me­to­do Juno fun­cio­na co­mo mé­to­do JSONRP­C!

Ejem­plo:

@route('/user')
@JSONRemote
def list(web,startwith='*',method=None):
    try:
        result=search(filter='(&(uid=*@bigclient.ar)(sn=%s*))'%startwith)
        resp=JSONResponse(result)
    except ldap.LDAPError, e:
        resp=JSONResponse(None,e.desc)
    return resp

¿Ven? Na­da de de­co­di­fi­car JSO­N. Y no co­di­fi­car tam­po­co, por­que creo la res­pues­ta usan­do es­to:

# This class creates a correct JSON response from Juno as required by Pyjamas
class JSONResponse(JunoResponse):
    def __init__(self,result=None,error=None,id=None,code=200):
        JunoResponse.__init__(self)
        self.headers['Content-Type']='text/javascript'
        self.append(json.dumps({'result':result,'error':error,'id':id,'code':code}))

Pro­ba­ble­men­te no sea una gran im­ple­men­ta­ción pe­ro me sir­ve por aho­ra.

Traducciones casi listas

Ma­ña­na voy a su­bir por lo me­nos una.

Si al­guien quie­re tra­du­cir a otros len­gua­je­s, me en­can­ta­ría in­cluir­los tam­bién.


Contents © 2000-2020 Roberto Alsina