Python Django csrf Fehler localhost

Django, Flask, Bottle, WSGI, CGI…
Antworten
PythonFatalError
User
Beiträge: 6
Registriert: Sonntag 24. September 2017, 20:31

Sonntag 22. Oktober 2017, 17:57

Hallo zusammen,

ich versuche mich zur Zeit an Django. Leider hänge ich gerade an folgendes.
Leider bekomme beim Abschicken eines Kommentars immer die Fehlermeldung "CSRF token missing or incorrect".

Das Bild sollte mein Problem verdeutlichen:
https://www.pic-upload.de/view-34149304/django.png.html

Meine View:

Code: Alles auswählen

from django.shortcuts import render
from django.shortcuts import get_object_or_404
from django.shortcuts import render_to_response

from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.template import RequestContext, loader


from .models import Meldung, Kommentar


def meldungen(request):
    return render_to_response('news/meldungen.html',
        RequestContext(request, {'meldungen' : Meldung.objects.all()}))


def meldungen_detail(request, meldungs_id):
    meldung = get_object_or_404(Meldung, id=meldungs_id)

    if 'speichere_kommentar' in request.POST:
        name = request.POST.get('besuchername', '')
        text = request.POST.get('kommentartext', '')
        
        if name and text:
            kommentar = meldung.kommentar_set.create(
                autor=name, text=text)
            kommentar.save()
            return HttpResponseRedirect('.')
        
        else:
            return render_to_response('news/meldungen_detail.html',
                RequestContext(request,
                    {'meldung' : meldung,
                     'fehler': 'Geben Sie Ihren Namen und ' \
                               'einen Kommentar an.',
                     'besuchername' : name, 'kommentartext' : text}))


    return render_to_response('news/meldungen_detail.html',
        RequestContext(request, {'meldung' : meldung}))
Mein Template:

[codebox=html5 file=Unbenannt.html]{% extends "main/basis.html" %}
{% block titel %}
News-Details für Eintrag {{ meldung.id }}
{% endblock %}
{% block inhalt %}
<div class="kontainer">
<div class="titelzeile">
<div class="titel">{{ meldung.titel|escape }}</div>
<div class="zeitstempel">{{ meldung.zeitstempel }}</div>
<div style="clear: both"></div>
</div>
<div class="text">
{{ meldung.text|escape|linebreaksbr }}
</div>
</div>
<div class="kontainer">
<div class="titelzeile">Kommentare</div>
{% if meldung.kommentar_set.count %}
<table>
{% for k in meldung.kommentar_set.all %}
<tr class="kommentarzeile">
<td class="spaltenbezeichner">{{ k.autor }}:</td>
<td>{{ k.text|escape|linebreaksbr }}</td>
</tr>
{% endfor %}
</table>
{% else %}
Keine Kommentare
{% endif %}
</div>
<div class="kontainer">
<div class="titelzeile">Neuer Kommentar</div>
<span class="fehler">{{ fehler }}</span>
<form method="post" action="">
{% csrf_token %}
<input type="hidden" name="speichere_kommentar" value="1"/>
<table>
<tr class="kommentarzeile">
<td class="spaltenbezeichner">Ihr Name:</td>
<td><input type="text" name="besuchername"
value="{{ besuchername }}"/></td>
</tr>
<tr class="kommentarzeile">
<td class="spaltenbezeichner">Kommentar:</td>
<td>
<textarea name="kommentartext">{{ kommentartext }}</textarea>
</td>
</tr>
</table>
<input type="submit" value="Abschicken" />
</form>
</div>
<div class="link_unten">
<a href="{% url 'news:meldungen' %}">Zur&uuml;ck</a>
</div>
{% endblock %}
[/code]



Ich hoffe jemand kann mir helfen.
Danke im Voraus!
Benutzeravatar
noisefloor
User
Beiträge: 2364
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Montag 23. Oktober 2017, 00:37

Hallo,

IMHO benutzt du `render_to_response` nicht korrekt:

ungetestet:

Code: Alles auswählen

...
return render_to_response('news/meldungen_detail.html', {'meldung':medlung}, context_instance=RequestContext(request))
Und äquivalent an der anderen Stelle auch.

Warum benutzt du überhaupt `render_to_response` und nicht `render`? `render_to_response` gilt als veraltet. Abgesehen davon bekommt `render` den Context direkt mitgeliefert, da braucht man sich nicht drum kümmern.
Oder direkt Class-Based Views benutzen. Ist eine sehr praktische Sache bei Django :-)

Welche Django-Version benutzt du?

Gruß, noisefloor
PythonFatalError
User
Beiträge: 6
Registriert: Sonntag 24. September 2017, 20:31

Montag 23. Oktober 2017, 16:51

Danke noisefloor erstmal für deine Hilfe.

Ich habe mich durch ein Python Buch durchgewälzt, da wurde auch Django in einem Kapitel behandelt. Bin hier allerdings noch sehr neu; in der Programmierung allgemein aber möchte in Richtung Webapplikationen gehen, und da ich schon einiges mit Python umgesetzt habe, habe ich Django im Visier :D. Werde ich auch noch mal konkret angehen, da mir einiges noch nicht ganz klar ist.
Warum benutzt du überhaupt `render_to_response` und nicht `render`?
Ich bin einfach mal dem Buchkapitel gefolgt. Dreht sich aber mehr um Python im allgemeinen als um Django. Django ist nur ein Kapitel bei über 1000 Seiten... Wollte mir erstmal einen soliden Überblick über Python selbst aneignen bevor ich Django an die Hand nehme.

Benutze aktuell Django version 1.10.6

Wie müsste denn der Code mit render aussehen? -ps habs gerade ein wenig ausprobiert aber nicht hinbekommen in meinem Beispiel.
Was ist denn der Vorteil von den Class-Based Views?

Vielen Dank!

Gruß PythonFatalError
Benutzeravatar
noisefloor
User
Beiträge: 2364
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Montag 23. Oktober 2017, 22:04

Hallo,

mit `render()` sollte das so aussehen (ungetestet):

Code: Alles auswählen

...
return render(request, 'news/meldungen_detail.html', {'meldung':meldung})
Wenn du Django lernen willst, dann gibt es zwei sehr empfehlenswerte Tutorials:
* das offizielle Djanog-Tutorial aus der Doku
* "Django for girls" - eignet sich auch für Jungs ;-)

Des Weiteren macht es bei Django IMHO Sinn, eine LTS-Version einzusetzen. Die aktuelle ist 1.11, welches bis April 2020 unterstützt wird. Der Support für Django 1.10 endet Ende diesen Jahres. Das hat übrigens nichts mit deinem Problem zu tun, dass hast du unter 1.11 genau so.

Class-based Views haben den Vorteil, dass man bei "Standardsachen" - dazu gehört auch das, was du vor hast - viele weniger Code braucht.
Ist aber auch in der offiziellen Django-Doku erklärt, inkl. dem Unterschied Function-based views vs. Class-Based views

Gruß, noisefloor
PythonFatalError
User
Beiträge: 6
Registriert: Sonntag 24. September 2017, 20:31

Montag 23. Oktober 2017, 23:04

Die Tutorials kenne ich auch, muss nur mal dazu kommen^^. Das Django for girls Tutorial hat mich aber des Namen wegen etwas abgeschreckt :D
Vielen Dank für deine Unterstützung & Geduld noisefloor, hast mir weitergeholfen!

Gruß

PythonFatalError
Benutzeravatar
noisefloor
User
Beiträge: 2364
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Dienstag 24. Oktober 2017, 00:55

Hallo,
Vielen Dank für deine Unterstützung & Geduld
Gern geschehen. Außerdem habe ich doch nur 2x geantwortet :-)

Bzgl. der Tutorials: ich hatte damals erst das offizielle Tutorial gelesen, dann kurz danach das Django for Girls. Dabei hat es bei mir dann "klick" gemacht, weil IMHO das Django for Girls Tutorial ein bisschen mehr "hands on" ist als das offizielle Django-Tutorial. Jedenfalls sollte man danach in der Lage sein, ohne größere Probleme einfach Apps mit Django zu schreiben.

Bücher braucht man zu Django IMHP nicht, weil a) die Doku von Django sehr umfangreich ist und b) man auch viele Antworten bei Stack Overflow findet.

Gruß, noisefloor
Sirius3
User
Beiträge: 7608
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 24. Oktober 2017, 07:14

Noch ergänzend zu noisefloors Aufzählung: c) Bücher sind meist veraltet, vor allem zu Django, vor allem wenn sie es nur nebenher das Thema behandeln.
Antworten