2015-04-06 6 views
8

Ho installato il JWT con pip. Ora voglio l'override del metodoDove posso sostituire il metodo jwt_response_payload_handler?

def jwt_response_payload_handler(token, user=None, request=None): 
    return { 'token': token, } 

di essere

def jwt_response_payload_handler(token, user=None): 
    return { 
     'token': token, 
     'user': UserSerializer(user).data 
    } 

Dove devo ignorarlo? Devo sovrascrivere il metodo nella mia app, ma dove e come? o posso modificare il codice originale nella libreria?

Ho modificato il metodo nella libreria e funziona correttamente, ma non penso che sia il modo corretto di farlo. Qualcuno può aiutarmi? Grazie

risposta

-1

Una volta creato il metodo del gestore personale, dovrai modificarlo nell'impostazione JWT_AUTH. Controlla la sezione Additional Settings nei documenti.

+0

La cosa è dove dovrei creare il proprio metodo di gestione? nella mia app o nella libreria JWT? Posso modificare la libreria e poi funziona. La cosa che non sono sicuro è che dovrei farlo, modificare il file nella libreria? – song

+0

@song Il metodo handler è disponibile ovunque per il tuo sys.path, di solito ovunque all'interno del tuo progetto va bene, ad esempio: 'my_project.utils.jwt_response_payload_handler' –

+1

@song Non dovresti mai modificare un pacchetto installato. –

15

ho trovato il successo nel seguente modo:

file di myapp.view.py:

def jwt_response_payload_handler(token, user=None, request=None): 
    return { 
     'token': token, 
     'bunny': 'fu fu' 
    } 

file di setting.py:

JWT_AUTH = { 
    'JWT_RESPONSE_PAYLOAD_HANDLER': 
    #'rest_framework_jwt.utils.jwt_response_payload_handler', 
    'myapp.views.jwt_response_payload_handler', 
} 

Implementare la funzione jwt_response_payload_handler in una posizione arbitraria, ma assicurati che si trovi nel tuo percorso Python. Per esempio in questo file: myapp.views.py

Poi nel file settings.py aggiornare la JWT_AUTH dizionario chiave JWT_RESPONSE_PAYLOAD_HANDLER con la nuova posizione del jwt_response_payload_handler appena creato.

Una volta capito cosa sta succedendo, è possibile adattare la soluzione come si desidera. Ad esempio, non consiglierei di lasciare la tua funzione sovrascritta nel file views.py. Era semplicemente più semplice per scopi dimostrativi.

Forse posizionare la funzione jwt_response_payload_handler in un file "helper.py" creato sarebbe una soluzione semplice.

+1

Questo mi ha aiutato molto. Era semplice e scritto chiaramente nella documentazione, eppure non sono riuscito a capirlo. Grazie. –

+1

Soluzione semplice e buona. – Vingtoft

+0

Un aggiornamento per chiunque incontri questo problema nel 2018. Devi avere 'JWT_PAYLOAD_GET_USER_ID_HANDLER': 'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler', anche in JWT_AUTH o l'override non funzionerà. –