2010-07-20 14 views
24

nella mia app django sto memorizzando stringhe di codice html nel db che verranno poi visualizzate nelle home page degli utenti come "messaggi". Alcuni di questi messaggi contengono moduli, ma non vengono scritti nella lingua del modello, non sono in grado di inserire il token csrf (interrompendo in tal modo l'app).Come posso incorporare il token django csrf direttamente in HTML?

C'è un modo per inserire questo token direttamente dai file python che sto modificando? Sto cercando qualcosa sulla falsariga di:

csrf_token = django.csrf.generate() 
message = "press the button please: <form><input type='hidden' name='csrf_token' value='%s'><input type='submit' value='press here'></form>" % (csrf_token) 

qualsiasi altra soluzione che avrebbe funzionato in uno scenario simile sarebbe grande. Grazie

Edit: realtà che non sta andando a lavorare perché il token è diverso per ogni sessione, quindi riporlo nel DB non è molto utile. c'è un modo per caricare dinamicamente il token all'interno della vista?

+0

Che cosa si intende per 'caricare dinamicamente il token all'interno della vista'? –

+0

il modulo viene memorizzato come una stringa nel database, quindi se lo memorizzo il file non sarà valido non appena viene caricato in una nuova sessione. Se fosse possibile caricare un nuovo token dalla vista, potrei intercettare l'html mentre veniva eseguito il rendering, inserire il token appropriato e visualizzare il modulo di lavoro. La cosa fondamentale qui è che non sto passando un modello per inserire il token. Questo lo rende più chiaro? – ergelo

+0

non puoi semplicemente usare il decoratore csrf_protect? – sureshvv

risposta

42

Chiama il numero django.middleware.csrf.get_token(request) per ottenere il token CSRF.

+1

che lo avrebbe risolto. Grazie per segnalarlo! – ergelo

+0

Funziona mettendo il token in un input nascosto? Perché continuo a ricevere lo stesso errore, quale sarebbe il modo migliore per inserire questo token nel modulo? –

+0

Okay, la soluzione per me era usare il nome "csrfmiddlewaretoken" invece di "csrf_token" –

17

Il modo di usarlo, è per utilizzarlo direttamente nei modelli.

Da the documentation,:

<form action="" method="post"> 
{% csrf_token %} 

è tutto ciò che dovete includere.

+0

grazie. il problema è che il 'messaggio' viene creato in una vista e memorizzato nel db senza mai passare attraverso una vista. Risolverò il problema ruotando il pulsante del modulo in un collegamento e passando attraverso una vista per aggirare il csrf. – ergelo

+8

la domanda è per il caso in cui non usi i modelli di django –

+0

Questo l'ho risolto durante l'installazione di Django-CMS! Per qualche ragione non accedeva senza questo token nell'unico template che avevo. Strano. – MadPhysicist

10

La risposta accettata presuppone che il token sia già impostato nell'oggetto richiesta.

Forse qualcosa di simile è meglio:

from django.middleware import csrf 
def get_or_create_csrf_token(request): 
    token = request.META.get('CSRF_COOKIE', None) 
    if token is None: 
     token = csrf._get_new_csrf_key() 
     request.META['CSRF_COOKIE'] = token 
    request.META['CSRF_COOKIE_USED'] = True 
    return token 
+0

grazie. questo funziona per me. – wildcolor

+0

non dovresti usare le API interne e infatti _get_new_csrf_key() non esiste più in Django. dovresti usare get_token(). – interDist