Im vorherigen Artikel haben wir die Funktionen zum Anzeigen von Artikeln bzw. Erstellen von Artikeln implementiert.
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.html
fü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>
 
<a>{
{ article.created|date:'Y-m-d H:i:s' }}</a>
 
<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.html
der 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 myModal
ein modales Feld mit dem Namen „.
Anschließend implementieren wir myModal
die 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:delete
um 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.