Python + Django4 para crear un blog personal (12): implemente la página con la función de eliminar artículos

En el artículo anterior, implementamos las funciones de mostrar artículos y crear artículos respectivamente.

Python + Django4 para crear un blog personal (11): use formularios para realizar la página funcional de creación de artículos_Blog-CSDN de blog de Li Weiwei wiwi En este artículo aprendimos a usar la clase Form de Django para procesar formularios, utilizando la herencia de los formularios.ModelForm Función de clase, nos damos cuenta de la correlación directa entre la forma y el modelo. Basado en la función de formulario, completamos la página funcional para crear artículos. En los próximos dos artículos, completaremos gradualmente las páginas funcionales para modificar y eliminar los artículos restantes. ... https://blog.csdn.net/agelee/article/details/126644558

En este artículo implementamos la función de eliminar artículos.

Implementación de funciones simples

Eliminar artículos es muy simple en términos de implementación de funciones, la función de visualización es la siguiente:

# 删文章
def article_delete(request, id):
    # 根据 id 获取需要删除的文章
    article = Article.objects.get(id=id)
    # 调用.delete()方法删除文章
    article.delete()
    # 完成删除后返回文章列表
    return redirect("list")
  • De manera similar a consultar artículos, debido a que necesita saber qué artículo debe eliminarse, debe pasar la identificación del artículo;
  • Luego llame a la función .delete() para eliminar la entrada de este artículo en la base de datos;
  • Regrese a la lista de artículos después de una eliminación exitosa.

Luego modifique el documento de configuración de enrutamiento.

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'),
]

Finalmente, modifique la plantilla y detail.htmlagregue un botón para eliminar artículos en la página de detalles.

<!-- 文章详情 -->
    <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>

Después de ejecutar el servidor, puede ver que se ha agregado un botón para eliminar artículo.

Eliminar la función de confirmación emergente

Lo anterior implementa una función simple, pero existe un peligro oculto: si accidentalmente haces clic en el botón Eliminar, es posible que ni siquiera tengas la oportunidad de arrepentirte.

Generalmente, para acciones que implican la eliminación directa de datos, se requiere una acción de confirmación en una ventana emergente y los datos de la base de datos se pueden eliminar directamente solo después de una segunda confirmación.

Para lograr esta función podemos usar el componente modal de Bootstrap.

Un modal es un subformulario que se superpone a un formulario principal. Normalmente, el propósito es mostrar contenido de una fuente separada que pueda tener alguna interacción sin salir del formulario principal. Los subformularios pueden proporcionar interacción de información, etc.

Elimine el código del artículo en detail.htmlla línea recién agregada antes y realice las siguientes modificaciones:

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

Se ha agregado un efecto de cuadro modal. Al hacer clic en este enlace aparecerá myModalun cuadro modal llamado.

Luego implementamos myModalla función de eliminar artículos en el cuadro modal.

<!-- 模态框 -->
    <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>

Aquí realmente implementamos dos funciones.

  • Se implementa un cuadro modal llamado myModal y se agregan dos botones al cuadro modal: Cancelar y Confirmar. Al hacer clic en Confirmar se llamará a la función JS confirm_delete()para eliminar el artículo.
  • Escribí una función confirm_delete()que llamará al artículo de eliminación de Django url:deletepara implementar la función de eliminación.

camino seguro

Puede pensar que la función de eliminar artículos no es difícil de implementar, pero tenga en cuenta que el método anterior tiene peligros ocultos . Para continuar la discusión en profundidad, tenemos que mencionar los ataques de falsificación de solicitudes entre sitios , también conocidos como ataques CSRF (falsificación de solicitudes entre sitios).

Ataque CSRF

Puede entender un ataque CSRF como: el atacante roba su identidad y envía solicitudes maliciosas en su nombre. Tomemos como ejemplo la eliminación de artículos:

  • El usuario inició sesión en el sitio web del blog A y el navegador registró la sesión y mantuvo el estado de inicio de sesión;
  • El usuario abrió accidentalmente el sitio web del malvado ataque B sin cerrar sesión ;
  • El sitio web atacante B implanta un código malicioso en la página y envía silenciosamente una solicitud para eliminar el artículo al sitio web del blog A. En este momento, el navegador piensa erróneamente que el usuario está operando y realiza con éxito la operación de eliminación.

Debido a la política del mismo origen del navegador, un atacante CSRF no puede obtener el contenido real de sus datos de inicio de sesión, pero puede engañar al navegador para que adjunte los datos de inicio de sesión correctos a la solicitud maliciosa. No subestimes el poder de los ataques CSRF: si tu cuenta bancaria tiene tales agujeros de seguridad, los piratas informáticos pueden transferir todos tus depósitos sin que nadie se dé cuenta.

Entonces, ¿cómo prevenir el riesgo de ataques CSRF aquí? Existe un método, es decir, utilizar el método POST al eliminar un artículo y verificar el token csrf.

ficha CSRF

Mencionamos anteriormente que se debe agregar csrf_token al enviar un formulario en Django. Este es el token CSRF. El proceso para prevenir ataques CSRF es el siguiente:

  • Cuando un usuario visita un sitio de Django, hay un campo implícito csrf_token en el formulario que Django envía al usuario. Este valor se genera aleatoriamente en el lado del servidor y es diferente cada vez;
  • Antes de que el backend procese la solicitud POST, Django verificará si el csrf_token en la cookie solicitada es consistente con el csrf_token en el formulario. Si son consistentes, la solicitud es legítima; de lo contrario, la solicitud puede provenir de un ataque CSRF y se devolverá 403 Server Forbidden Access.

Dado que el atacante no puede obtener el contenido de las cookies del usuario (solo depende del navegador para reenviarlo), generalmente es imposible construir el csrf_token correcto, lo que previene tales ataques.

Utilice el formulario para enviar la solicitud de publicación

Para enviar una solicitud de publicación en Django, puede especificar el método de solicitud en el formulario.

Primero, agregue un formulario oculto debajo del código del botón eliminar artículo:

 <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>

A continuación modificamos nuestra confirm_delete()función.

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

Finalmente, transformamos la función de vista:

# 删文章
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请求")

Anteriormente, nuestra función era llamar directamente a la URL para solicitar la función de eliminación de vistas de Django.

Ahora, después de nuestra transformación, el proceso de código para eliminar artículos es el siguiente:

  • Al hacer clic en el enlace eliminar artículo, aparece un cuadro modal
  • Después de hacer clic en el botón de confirmación del cuadro modal, busque el formulario oculto a través del código de función JS y envíe el formulario.
  • El formulario inicia una solicitud POST y lleva el token csrf (Django verifica todas las solicitudes POST a través del middleware de forma predeterminada csrf ), evitando así ataques csrf.

Conclusión

En este artículo, aprendimos cómo implementar la función de eliminar artículos y también utilizamos el cuadro emergente modal de Bootstrap para realizar una verificación secundaria de los artículos eliminados.

En lo que respecta a la función de eliminación, para aumentar la seguridad de los datos, presentamos brevemente csrf el mecanismo de protección de tokens de Django y habilitamos crsfel mecanismo de verificación de Django mediante el uso de un formulario oculto y el envío de una solicitud de publicación.

La función de eliminación en realidad tiene una verificación importante: la verificación del usuario, que aún no hemos cubierto. Lo arreglaremos para agregarla más adelante cuando agreguemos funciones del módulo de usuario.

En el siguiente artículo, aprenderá cómo actualizar un artículo.

Supongo que te gusta

Origin blog.csdn.net/agelee/article/details/126702871
Recomendado
Clasificación