Python + Django4 zum Erstellen eines persönlichen Blogs (12): Implementieren Sie die Seite mit der Funktion zum Löschen von Artikeln

Im vorherigen Artikel haben wir die Funktionen zum Anzeigen von Artikeln bzw. Erstellen von Artikeln implementiert.

Python + Django4 zum Erstellen eines persönlichen Blogs (11): Verwenden Sie Formulare, um die funktionale Seite zum Erstellen von Artikeln zu realisieren_Li Weiwei wiwis Blog-CSDN-Blog In diesem Artikel haben wir gelernt, die Form-Klasse von Django zum Verarbeiten von Formularen zu verwenden und dabei die Vererbung von zu verwenden Formen.ModelForm-Klassenfunktion, wir erkennen die direkte Korrelation zwischen dem Formular und dem Modell. Basierend auf der Formularfunktion haben wir die Funktionsseite zum Erstellen von Artikeln vervollständigt. In den nächsten beiden Artikeln werden wir nach und nach die Funktionsseiten zum Ändern und Löschen der verbleibenden Artikel vervollständigen. ... https://blog.csdn.net/agelee/article/details/126644558

In diesem Artikel implementieren wir die Funktion zum Löschen von Artikeln.

Einfache Funktionsimplementierung

Das Löschen von Artikeln ist hinsichtlich der Funktionsimplementierung sehr einfach. Die Ansichtsfunktion lautet wie folgt:

# 删文章
def article_delete(request, id):
    # 根据 id 获取需要删除的文章
    article = Article.objects.get(id=id)
    # 调用.delete()方法删除文章
    article.delete()
    # 完成删除后返回文章列表
    return redirect("list")
  • Ähnlich wie beim Abfragen von Artikeln müssen Sie die ID des Artikels übergeben, da Sie wissen müssen, welcher Artikel gelöscht werden soll.
  • Rufen Sie dann die Funktion .delete() auf, um den Eintrag dieses Artikels in der Datenbank zu löschen;
  • Nach erfolgreichem Löschen kehren Sie zur Artikelliste zurück.

Ändern Sie dann das Routing-Konfigurationsdokument

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', views.hello),
    re_path(r'^$', views.article_list),
    path('list/', views.article_list, name='list'),  # 展示文章
    path('detail/<int:id>/', views.article_detail, name='detail'),  # 文章详情
    path('create/', views.article_create, name='create'),  # 写文章
    # 增加生删除文章
    path('delete/<int:id>/', views.article_delete, name='delete'),
]

Ändern Sie abschließend die Vorlage und detail.htmlfügen Sie auf der Detailseite eine Schaltfläche zum Löschen von Artikeln hinzu.

<!-- 文章详情 -->
    <div class="container">
        <!--    <div class="row">-->
        <!-- 标题及作者 -->
        <h1 class="col-12 mt-4 mb-4">{
   
   { article.title }}</h1>
        <div class="col-12 alert alert-primary">
            <div class="col-12">
                <a>作者:{
   
   { article.author }}</a>
                &nbsp
                <a>{
   
   { article.created|date:'Y-m-d H:i:s' }}</a>
                &nbsp
                <a href="{% url "delete" article.id %}">删除文章</a>   #增加此项
            </div>
        </div>
        <!-- 文章正文 -->
        <div class="col-12">
            <p>{
   
   { article.body }}</p>
        </div>
    </div>

Nach dem Ausführen des Servers können Sie sehen, dass eine Schaltfläche zum Löschen von Artikeln hinzugefügt wurde.

Entfernen Sie die Popup-Bestätigungsfunktion

Das Obige implementiert eine einfache Funktion, es besteht jedoch eine versteckte Gefahr: Wenn Sie versehentlich auf die Schaltfläche „Löschen“ klicken, haben Sie möglicherweise nicht einmal die Chance, es zu bereuen.

Im Allgemeinen ist für Aktionen mit direkter Datenlöschung eine Bestätigungsaktion in einem Popup-Fenster erforderlich, und die Datenbankdaten können erst nach einer zweiten Bestätigung direkt gelöscht werden.

Um diese Funktion zu erreichen, können wir die modale Komponente von Bootstrap verwenden.

Ein Modal ist ein Unterformular, das ein übergeordnetes Formular überlagert. Typischerweise besteht der Zweck darin, Inhalte aus einer separaten Quelle anzuzeigen, die eine gewisse Interaktion ermöglichen, ohne das übergeordnete Formular zu verlassen. Unterformulare können Informationsinteraktion usw. bereitstellen.

Löschen Sie zuvor den Artikelcode in detail.htmlder neu hinzugefügten Zeile und nehmen Sie folgende Änderungen vor:

 <a href="#" data-bs-toggle="modal" data-bs-target="#myModal">删除文章</a>

Ein modaler Boxeffekt wurde hinzugefügt. Wenn Sie auf diesen Link klicken, wird myModalein modales Feld mit dem Namen „.

Anschließend implementieren wir myModaldie Funktion zum Löschen von Artikeln in der Modalbox.

<!-- 模态框 -->
    <div class="modal fade" id="myModal">
        <div class="modal-dialog modal-dialog-centered modal-sm">
            <div class="modal-content">
                <!-- 模态框头部 -->
                <div class="modal-header">
                    <h4 class="modal-title">确认删除</h4>
                    <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
                </div>
                <!-- 模态框主体 -->
                <div class="modal-body">
                    确认删除文章?
                </div>
                <!-- 模态框底部 -->
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
                    <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="confirm_delete()">
                        确定
                    </button>
                </div>
            </div>
        </div>
    </div>
    <script>
        // 删除文章的函数
        function confirm_delete() {
            location.href = '{% url "delete" article.id %}'
        }
    </script>

Hier implementieren wir tatsächlich zwei Funktionen.

  • Ein modales Feld mit dem Namen myModal wird implementiert und dem modalen Feld werden zwei Schaltflächen hinzugefügt: Abbrechen und Bestätigen. Wenn Sie auf „Bestätigen“ klicken, wird die JS-Funktion aufgerufen, confirm_delete()um den Artikel zu löschen.
  • Ich habe eine Funktion geschrieben confirm_delete(), die Djangos Löschartikel aufruft, url:deleteum die Löschfunktion zu implementieren.

sicherer Weg

Sie denken vielleicht, dass die Funktion zum Löschen von Artikeln nicht schwer zu implementieren ist, aber bitte beachten Sie, dass die obige Methode versteckte Gefahren birgt . Um die Diskussion ausführlicher fortzusetzen, müssen wir Cross-Site-Request-Forgery-Angriffe erwähnen , auch bekannt als CSRF-Angriffe (Cross-Site Request Forgery).

CSRF-Angriff

Unter einem CSRF-Angriff können Sie Folgendes verstehen: Der Angreifer stiehlt Ihre Identität und sendet in Ihrem Namen böswillige Anfragen. Nehmen wir als Beispiel das Löschen von Artikeln:

  • Der Benutzer hat sich auf der Blog-Website A angemeldet , der Browser hat die Sitzung aufgezeichnet und den Anmeldestatus beibehalten.
  • Der Benutzer hat versehentlich die Website B des bösen Angriffs geöffnet, ohne sich abzumelden .
  • Der Angriff auf Website B implantiert bösartigen Code in die Seite und sendet stillschweigend eine Anfrage zum Löschen des Artikels an Blog-Website A. Zu diesem Zeitpunkt geht der Browser fälschlicherweise davon aus, dass der Benutzer aktiv ist, und führt den Löschvorgang erfolgreich durch.

Aufgrund der Same-Origin-Richtlinie des Browsers kann ein CSRF-Angreifer nicht an den tatsächlichen Inhalt Ihrer Anmeldedaten gelangen, kann aber den Browser dazu verleiten, der böswilligen Anfrage die richtigen Anmeldedaten anzuhängen. Unterschätzen Sie nicht die Macht von CSRF-Angriffen: Wenn Ihr Bankkonto solche Sicherheitslücken aufweist, können Hacker alle Ihre Einzahlungen überweisen, ohne dass es jemand merkt.

Wie kann hier also das Risiko von CSRF-Angriffen verhindert werden? Es gibt eine Methode: Verwenden Sie beim Löschen eines Artikels die POST-Methode und überprüfen Sie das CSRF-Token.

CSRF-Token

Wir haben bereits erwähnt, dass beim Senden eines Formulars in Django csrf_token hinzugefügt werden muss. Dies ist das CSRF-Token. Der Prozess zur Verhinderung von CSRF-Angriffen ist wie folgt:

  • Wenn ein Benutzer eine Django-Site besucht, gibt es ein implizites Feld csrf_token in der Form, die Django an den Benutzer zurückmeldet. Dieser Wert wird auf der Serverseite zufällig generiert und ist jedes Mal anders;
  • Bevor das Backend die POST-Anfrage verarbeitet, überprüft Django, ob das csrf_token im angeforderten Cookie mit dem csrf_token im Formular übereinstimmt. Wenn sie konsistent sind, ist die Anfrage legitim. Andernfalls könnte die Anfrage von einem CSRF-Angriff stammen und 403 Server Forbidden Access wird zurückgegeben.

Da der Angreifer den Cookie-Inhalt des Benutzers nicht erhalten kann (er verlässt sich lediglich darauf, dass der Browser ihn weiterleitet), ist es normalerweise unmöglich, das richtige csrf_token zu erstellen und so solche Angriffe zu verhindern.

Verwenden Sie das Formular, um eine Beitragsanfrage zu senden

Um eine Post-Anfrage in Django zu senden, können Sie die Anfragemethode im Formular angeben.

Fügen Sie zunächst ein verstecktes Formular unter dem Code der Schaltfläche „Artikel löschen“ hinzu:

 <a href="#" data-bs-toggle="modal" data-bs-target="#myModal">删除文章</a>
                <!-- 新增一个隐藏的表单 -->
                <form
                        style="display:none;"
                        id="safe_delete"
                        action="{% url "delete" article.id %}"
                        method="POST"
                >
                    {% csrf_token %}
                    <button type="submit">发送</button>
                </form>

Als nächstes modifizieren wir unsere confirm_delete()Funktion.

 <script>
        // 删除文章的函数
        function confirm_delete() {
            document.getElementById("safe_delete").submit();
        }
    </script>

Abschließend transformieren wir die Ansichtsfunktion:

# 删文章
def article_delete(request, id):
    print(request.method)
    if request.method == 'POST':
        # 根据 id 获取需要删除的文章
        article = Article.objects.get(id=id)
        # 调用.delete()方法删除文章
        article.delete()
        return redirect("list")
    else:
        return HttpResponse("仅允许post请求")

Zuvor bestand unsere Funktion darin, die URL direkt aufzurufen, um die Ansichtslöschfunktion von Django anzufordern.

Nach unserer Transformation sieht der Codeprozess zum Löschen von Artikeln wie folgt aus:

  • Wenn Sie auf den Link „Artikel löschen“ klicken, wird ein modales Feld angezeigt
  • Nachdem Sie auf die Bestätigungsschaltfläche des Modalfelds geklickt haben, suchen Sie das versteckte Formular über den JS-Funktionscode und senden Sie das Formular ab.
  • Das Formular initiiert eine POST-Anfrage und trägt das CSRF-Token (Django überprüft standardmäßig alle POST-Anfragen über Middleware csrf ), wodurch CSRF-Angriffe vermieden werden.

Abschluss

In diesem Artikel haben wir gelernt, wie man die Funktion zum Löschen von Artikeln implementiert, und haben außerdem das modale Popup-Fenster von Bootstrap verwendet, um eine sekundäre Überprüfung gelöschter Artikel durchzuführen.

Was die Löschfunktion betrifft, haben wir zur Erhöhung der Datensicherheit kurz den csrf Token-Schutzmechanismus von Django vorgestellt und den crsfÜberprüfungsmechanismus von Django aktiviert, indem wir ein verstecktes Formular verwendet und eine Post-Anfrage gesendet haben.

Die Löschfunktion verfügt tatsächlich über eine wichtige Überprüfung: die Benutzerüberprüfung, die wir noch nicht behandelt haben. Wir werden sie später beim Hinzufügen von Benutzermodulfunktionen hinzufügen.

Im nächsten Artikel erfahren Sie, wie Sie einen Artikel aktualisieren.

Ich denke du magst

Origin blog.csdn.net/agelee/article/details/126702871
Empfohlen
Rangfolge