2010-09-05 14 views
165

Sto guardando oltre this website ma non riesco a capire come farlo perché non funziona. Ho bisogno di controllare se l'utente del sito corrente è connesso (autenticato), e sto cercando:Come verificare se un utente ha effettuato l'accesso (come utilizzare correttamente user.is_authenticated)?

request.user.is_authenticated 

pur essendo sicuri che l'utente è connesso, restituisce solo:

> 

I' m in grado di fare altre richieste (dalla prima sezione nell'url sopra), come ad esempio:

request.user.is_active 

che restituisce una risposta positiva.

risposta

373

is_authenticated è una funzione. Si dovrebbe chiamare in

if request.user.is_authenticated(): 
    # do something if the user is authenticated 

Come Peter Rowell ha sottolineato, ciò che può essere inciampare in su è che nel linguaggio di Django modello predefinito, non si virare su parentesi per richiamare le funzioni. Qualcosa di così si può avere visto come questo nel codice del modello:

{% if user.is_authenticated %} 

Tuttavia, in codice Python, è davvero un metodo nella classe User.

Modifica per Django 1.10: is_authenticated è ora un attributo in Django 1.10. Il metodo esiste ancora per compatibilità con le versioni precedenti, ma verrà rimosso in Django 2.0.

+0

oh ok ..grazie per le informazioni, questo ha senso quindi perché non funzionava, a meno che non mi fossi perso qualcosa, non è chiaro in proposito nella documentazione di django – Rick

+1

@Rick: mi permetto di dissentire con te. is_authenticated() è il secondo elemento elencato nella sezione * metodi * dei modelli di classe.Utente. Ciò che può essere fonte di confusione è che il * linguaggio template * non * usa * il trailing(), quindi potresti vedere qualcosa come {% se user.is_authenticated%}. Riceverai un errore se inserisci la(). (Vedi http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.is_authenticated e http : //docs.djopoproject.com/en/1.2/topics/templates/#variables) –

+2

@Peter, beh non usano() negli esempi, mi rendo conto che sono sicuro che hanno spiegato da qualche parte che è un metodo e come farlo correttamente, è semplicemente bello quando un'API utilizza la sintassi della vita reale in modo che possa essere rapidamente acquisita da qualcuno di nuovo in un progetto come Django, solo un piccolo cruccio immagino che tendo a sfogliare le cose ma io rendersi conto che avrei dovuto guardare più da vicino, grazie per l'aiuto – Rick

13

seguente blocco dovrebbe funzionare:

{% if user.is_authenticated %} 
     <p>Welcome {{ user.username }} !!!</p>  
    {% endif %} 
4

Django 1.10+

Utilizzare un attributo, non un metodo:

if request.user.is_authenticated: # <- no parentheses any more! 
    # do something if the user is authenticated 

L'utilizzo del metodo della stessa il nome è deprecato in Django 2.0 e non è più menzionato nella documentazione di Django.


Si noti che per Django 1.10 e 1.11, il valore della proprietà è un CallableBool e non un booleano, che può causare alcuni bug strani. Per esempio, ho avuto una visione che ha restituito JSON

return HttpResponse(json.dumps({ 
    "is_authenticated": request.user.is_authenticated() 
}), content_type='application/json') 

che dopo aggiornato alla proprietà request.user.is_authenticated stava gettando l'eccezione TypeError: Object of type 'CallableBool' is not JSON serializable. La soluzione era quella di utilizzare JsonResponse, che potrebbe gestire l'oggetto CallableBool correttamente durante la serializzazione:

return JsonResponse({ 
    "is_authenticated": request.user.is_authenticated 
}) 
0

Secondo lei:

{% if user.is_authenticated %} 
<p>{{ user }}</p> 
{% endif %} 

In te funzioni del regolatore aggiungono decoratore:

from django.contrib.auth.decorators import login_required 
@login_required 
def privateFunction(request): 
Problemi correlati