Django: Probleme mit Implementierung von Aktivierungslink

Django, Flask, Bottle, WSGI, CGI…
Antworten
AFX
User
Beiträge: 51
Registriert: Samstag 4. September 2021, 08:40

Ich bin gerade dabei, eine Anmeldung mit Emailbestätigung zu schreiben.

Nun verstehe ich nicht, was der Link tun soll… Meine Funktion, die den Aktivierungslink raushaut, sieht so aus:

Code: Alles auswählen

def sendmailconfirm(self):
    file = open(MEDIA_ROOT + os.path.sep + 'sent_emails/myfile.txt', 'r')
    content = file.read()
    file.close()

    # EmailMessage class version
    mail = EmailMessage('subject', content, '<meinemailaddy>@web.de', [self.cleaned_data['email']])
    mail.send()
Nun habe ich unter accounts/reset/MQ folgende html-Datei (password_reset_confirm):

Code: Alles auswählen

<!-- templates/registration/password_reset_confirm.html -->
{% extends "base.html" %}

{% block title %}Enter new password{% endblock %}

{% block content %}

{% if validlink %}

<h1>Set a new password!</h1>
<form method="POST">
  {% csrf_token %}
  {{ form.as_p }}
  <input type="submit" value="Change my password">
</form>

{% else %}

<p>The password reset link was invalid, possibly because it has already been used.  Please request a new password reset.</p>

{% endif %}
{% endblock %}
Aber immer, wenn ich den Bestätigungslink klicke, kommt so ne Seite namens Django-Verwaltung, wo steht:

Passwort nicht erfolgreich zurückgesetzt
Der Link zum Zurücksetzen Ihres Passworts ist ungültig, wahrscheinlich weil er schon einmal benutzt wurde. Bitte setzen Sie Ihr Passwort erneut zurück.

Ich denke mal, da habe ich was übersehen, daher meine Frage: Wie soll ich da weitermachen? Besten Dank im Voraus für Tipps :-)
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Zum Code: Dateien öffnet man mit dem with Statement, damit man nicht per Hand schließen muss.

Ansonsten hat der gezeigte Code nichts mit dem Problem zu tun. Welches Modul verwendest du? Wie konfiguriert? Wie sieht der View aus? Was hat der Passwort Reset mit der E-Mail-Bestätigung zu tun?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es hat nix mit deinem eigentlichen Problem zu tun, aber die Art, wie du da die Datei oeffnest und schliesst ist wirklich abenteuerlich.

Man benutzt nicht open/close, sondern das with-Statement. Und man stueckelt sich keine Pfade mit + und os.path.sep zusammen. Sondern man benutzt die pathlib. Wenn man die benutzt, kann man sich in diesem Fall sogar das with sparen, weil die schon gleich eine read_text Methode kennt:

Code: Alles auswählen

import pathlib

MEDIA_ROOT = pathlib.Path(...)

...

def sendmailconfirm(self):
     content = (MEDIA_ROOT / "sent_emails" / "myfile.txt").read_text(encoding="utf-8")
...
Was dein Problem angeht: ich benutze Django nicht, aber habe solche Funktionen natuerlich schon gebaut. Das klingt so, als ob der Link nicht die korrekten Argumente hat. Der muss ja sowas wie einen hash dran kleben haben, damit man das zuordnen kann. Wie sieht der also aus, und wie soll der laut Doku aussehen?
AFX
User
Beiträge: 51
Registriert: Samstag 4. September 2021, 08:40

sparrow hat geschrieben: Samstag 28. Mai 2022, 10:46 Wie sieht der also aus, und wie soll der laut Doku aussehen?
Ich hab mir das ganze Ding aus dieser Doku gerippt: https://learndjango.com/tutorials/djang ... t-tutorial

Da steht:
But the important section for now is the URL included. In the email above, mine is http://127.0.0.1:8000/accounts/reset/MQ ... baaf3c77f/. Copy and paste yours into your browser and you'll be automatically routed to the Password reset confirmation page.
We aber bekomme ich nun meine URL raus (das steht da nicht, kA ich kenne auch keine Doku, wo das steht - oder ist das Djangomagie)?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Kannst du das und dich bitte einmal sortieren und die gestellten Fragen beantworten?

Was willst du tun? Aktivierungslink oder Password reset?
Das sind zwei völlig unterschiedliche Dinge - und das eine nennst du in der Überschrift, das andere ist das, worauf sich deine Codehäppchen und das Tutorial bezieht.
AFX
User
Beiträge: 51
Registriert: Samstag 4. September 2021, 08:40

Ich versuche in der Tat einen Aktivierungslink zu versenden. Ich versuche das mit django.contrib.auth zu schaffen. In der view gibt es da eine Funktion, die einen POST-request sendet, wenn die Anmelde-Form valide ausgefüllt wurde:

Code: Alles auswählen

def signup(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            form.sendmailconfirm()
            form.save()
Doch was mir Rätsel aufgibt ist, was genau da für ein Link zu generieren ist,dass der angemeldete und somit in die DB eingetragene Benutzer eben aktiviert wird.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Das ist nicht ganz trivial selbst zu implementieren.
Nach kurzem Googeln: Hier wird das ganz gut erklärt. Zumindest springt mir da beim schnellen Drüberschauen nichts Schlimmes ins Ausge.
AFX
User
Beiträge: 51
Registriert: Samstag 4. September 2021, 08:40

Super danke!!
gomez72
User
Beiträge: 71
Registriert: Sonntag 28. März 2021, 09:57

HI, ich habe in den letzten beiden Tagen die gleiche Funktion bei bei meiner Seite implementiert.
Kontnte ein Modul finden, dass sich als APP dann einbinden lässt und keine Wünsche in der Sache offen lässt.
Die Implemenatation ist gut beschrieben und hat bei mir funktioniert

https://pypi.org/project/Django-Verify-Email/
vg gomez
Antworten