Django-Registration Setup senza password
-
27-10-2019 - |
Domanda
Sto cercando di creare un sito Web, in cui le persone mettono solo i loro indirizzi e -mail e sono effettuati con cookie e tutto il resto. In una fase successiva, chiederò loro di fornire password e nomi, ma non verrà utilizzato nessun nome utente. Sto cercando di farlo con Django-Registration, ma ho errori e ho alcuni problemi.
Prima di disabilitare i nomi utente come funzionalità di accesso, ho messo STR (time ()) invece del nome utente - stavo cercando qualcosa che cambierà ogni volta.
Tuttavia, quando salto l'autenticazione (di cui al momento non ho bisogno) ricevo un errore:
'RegistrationProfile' object has no attribute 'backend'
In alternativa, posso lasciare l'autenticazione ma non so come autenticarla solo con e -mail e nessuna password. Inoltre, non so come far funzionare la riga successiva:
auth.login(request, ProfileUser)
Se qualcuno può tirarmi fuori di qui, sarebbe fantastico. Ecco un po 'di codice:
La mia classe di forma:
class RegistrationFormCustom(forms.Form):
email = forms.EmailField()
def do_save(self):
new_u = User(username=str(time()),email= self.cleaned_data.get('email'),)
new_u.save()
new_p = Profile.objects.create_profile(new_u)
new_p.save()
return new_p
la mia opinione:
def registerCustom(request, backend, success_url=None, form_class=None,
disallowed_url='registration_disallowed',
template_name='registration/registration_form.html',
extra_context=None,
initial={}):
form = RegistrationFormCustom(initial=initial)
if request.method == 'POST':
form = RegistrationFormCustom(initial=initial, data=request.POST)
if form.is_valid():
profile = form.do_save()
profile = auth.authenticate(username = profile.user.email, password = form.cleaned_data.get('pass1'))
print(profile)
auth.login(request, profile)
return redirect('/')
else:
pass
return render_jinja(request, 'registration/registration_form.html',
type="register",
form = form
)
E posterò felicemente qualsiasi altro brontolio richiesto
Soluzione
Stai ottenendo il 'RegistrationProfile' object has no attribute 'backend'
Errore perché l'utente non è ancora autenticato. Per accedere a qualcuno, devi chiamare il authenticate
Metodo prima, che richiede una password. Quindi, quello che puoi fare invece è questo:
from django.contrib.auth import load_backend, login, logout
from django.conf import settings
def _login_user(request, user):
"""
Log in a user without requiring credentials (using ``login`` from
``django.contrib.auth``, first finding a matching backend).
"""
if not hasattr(user, 'backend'):
for backend in settings.AUTHENTICATION_BACKENDS:
if user == load_backend(backend).get_user(user.pk):
user.backend = backend
break
if hasattr(user, 'backend'):
return login(request, user)
Quindi, per accedere a qualcuno, chiama semplicemente il _login_user
funzione con la richiesta e User
modello. (Questo sarà profile.user
Nel tuo caso, probabilmente) fallo invece di chiamare auth.login
. Non sono sicuro di come hai intenzione di determinare se si tratta di un utente valido o meno, senza una password o un nome utente, ma te lo lascerò. Se hai ancora problemi, fammi sapere.
Breve spiegazione:
Ciò che in pratica accade qui è che Django richiede che un utente sia autenticato per essere effettuato l'accesso tramite il login
funzione. Quell'autenticazione viene solitamente eseguita dal authenticate
funzione, che richiede un nome utente e una password e verifica se la password fornita corrisponde alla versione hash nel database. In tal caso, aggiunge un backend di autenticazione al User
modello.
Quindi, dal momento che non hai una password e un nome utente, devi solo scrivere il tuo metodo per aggiungere il backend di autenticazione al User
modello. Ed è quello che il mio _login_user
) funzione fa: se l'utente è già autenticato, chiama solo login
, altrimenti, aggiunge innanzitutto il backend predefinito al User
Modello, senza verificare un nome utente e una password corretti (come authenticate
fa).
Altri suggerimenti
Per altri che leggono questo thread, ho ricevuto un messaggio di errore simile quando utilizzavo user.objects.create () anziché user.objects.create_user (). Fondamentalmente, il primo metodo era impostare una password chiara mentre Create_user crittografa la password. Le password di cancellazione non riusciranno ad autenticarsi. Controlla il tuo database, se hai le password impostate in Clear, è probabile che sia necessario utilizzare Create_User ().
La richiesta dell'autore potrebbe essere risolta semplicemente impostando un utente e una password predefiniti utilizzando create_user () anziché solo utente.save ().
È possibile creare una password nota (mettila in impostazione.py) e utilizzarla come se l'utente la inserisse. Crea l'utente con questo e autentica l'utente con questo.