首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这个Django视图在post时被执行了两次?

Django是一个流行的Python Web框架,其视图函数用于处理HTTP请求并返回相应的HTTP响应。当我们在使用Django开发应用时,有时会遇到视图在进行POST请求时被执行两次的情况。下面是可能导致这个问题的几个原因和解决方法:

  1. 原因:重复的表单提交。当用户点击表单的提交按钮时,有可能由于网络延迟或用户的多次点击,导致表单重复提交。
  2. 解决方法:可以通过在视图函数中添加幂等性校验来避免重复提交。比如,可以使用Django的django.middleware.csrf.CsrfViewMiddleware中间件来保护表单提交,并在视图函数中添加@csrf_protect装饰器来验证表单的唯一性。
  3. 原因:重定向。有时,视图函数中的代码可能导致在POST请求完成后进行重定向,而浏览器会自动发起一次GET请求来获取重定向后的页面。
  4. 解决方法:可以使用Django提供的HttpResponseRedirect类来进行重定向,并确保只在POST请求时才执行重定向。
  5. 原因:中间件引起的重复执行。有些自定义的中间件可能会导致视图函数在请求处理过程中被多次执行。
  6. 解决方法:可以检查中间件的代码,并确保中间件的执行逻辑正确,不会重复执行视图函数。

总结来说,出现Django视图在POST时被执行两次的问题通常是由于表单重复提交、重定向或中间件引起的。通过添加幂等性校验、正确处理重定向和检查中间件代码,我们可以解决这个问题。

相关链接:

  • Django官方文档:https://docs.djangoproject.com/
  • Django中间件文档:https://docs.djangoproject.com/en/3.2/topics/http/middleware/
  • Django中的CSRF保护:https://docs.djangoproject.com/en/3.2/ref/csrf/
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

爬虫框架Scrapy(二)

希望大家要么创造阳光,要么传递阳光。 ? 爬虫框架Scrapy(二) 1.请求和响应 1.为什么要三次握手? 答:本质原因是避免服务器空耗资源。...客户端和服务器开始传输数据,但是交流的过程中如果丢的包又回来了,然后服务器开了一个线程进行连接客户端,同时向客户端发起连接请求,但是这个数据包失效,客户端不会再发消息,服务器会一直等待,空耗资源,...body:接收json字符串,为POST的数据,发送payload_post请求使用。 5.web程序运行的基本流程: a.客户端发送请求。b.服务器返回响应。...c.MapAdapter:浏览器中通过具体的url,适配具体的视图函数,满足url规则及请求方法,即调用对应的视图函数。 d.Baseconverter:转换器,负责url地址中匹配参数。...端点默认是和视图函数同名的,因为使用的是装饰器实现的,自己手动实现路由,那么可以自己指定。 10.Flask中URL为什么使用列表?

79410
  • 第 3 篇:实现博客首页文章列表 API

    基于模板引擎的开发方式中,博客首页文章列表的视图函数可能是这样的: from django.shortcuts import render from .models import Post def..., 'blog/index.html', context={'post_list': post_list}) django-rest-framework,代码逻辑是一样的,只是最后返回结果,返回资源序列化后的结果...为什么需要这个视图函数装饰器呢?之前说过,django-rest-framework 为 API 的开发提供丰富的功能,包括内容协商、认证和鉴权、限流等等。...这些过程 django 默认的视图函数处理 HTTP 请求是没有提供的,而经过 api_view 装饰后的视图,则提供上述全部功能。...现在我们已经有视图函数,最后,我们需要给这个视图函数绑定 URL, blog 应用下的 urls.py 中加入绑定的代码: path('api/index/', views.index) 启动开发服务器

    1K20

    django-rest-framewor

    DRF对django视图配置流程图(个人画) ?...2 解析器组件 (用来解析数据的请求的组件)   Django并不能处理请求协议为application/json编码协议的数据   注意: DRF解析器会封装到View中的parsers内,视图函数被调用时...接口设计 url定义:需要为post新增url,因为根据规范,url定位资源,http请求方式定义用户行为 定义post方法:视图类中定义post方法 开始序列化:通过我们上面定义的序列化类,创建一个序列化对象...程序启动,开始初始化,获取配置信息,获取视图类并加载到内存中,获取url及视图类的对应关系 开始绑定视图类和url的对应关系,执行as_view()方法 as_view()方法被执行的时候传递了参数,为字典形式...,它并没有重写dispatch方法 该方法返回视图函数view,注意在这个函数中有一个行 self = cls(**initkwargs), cls是视图类,执行视图函数self就指向视图函数的实例对象

    1.6K10

    注册

    Django 用户系统内置登录、修改密码、找回密码等视图,但是唯独用户注册的视图函数没有提供,这一部分需要我们自己来写。...编写用户注册表单 Django 已经内置一个用户注册表单:django.contrib.auth.forms.UserCreationForm,不过这个表单的一个小问题是它关联的是 django 内置的...我们还希望用户注册提供邮箱地址,所以 fields 中增加了 email 字段。...设置 URL 模式 视图函数需要和对应的 URL 绑定,这样当用户访问某个 URL Django 才知道调用哪个视图函数处理用户请求。...在这个目录下有模板文件所在的目录 templates/,于是利用os.path.join 把这两个路径连起来,构成完整的模板路径,Django 就知道去这个路径下面找我们的模板

    9.1K60

    cookie、session和中间件

    我们可以给每个客户端的Cookie分配一个唯一的id,这样用户访问,通过Cookie,服务器就知道来的人是“谁”。...Django设置session是针对浏览器的,如果同一台电脑的同一浏览器,多用户登录在数据库中只会产生一条记录,但是不影响各个用户对session值的取用。...说的直白一点中间件是帮助我们视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义几个方法,Django框架会在请求的特定的时间去执行这些方法。...我们之前已经接触过一个csrf相关的中间件?我们一开始让大家把他注释掉,再提交post请求的时候,就不会被forbidden,后来学会使用csrf_token之后就不再注释这个中间件。...process_request和process_response process_request有一个参数,就是request,这个request和视图函数中的request是一样的(交给Django

    1.2K20

    Django框架学习(二)

    方法返回的是dispatch这个方法的调用;调用这个方法的时候,里面进行了一个处理(先获取了请求方法request.method,然后再利用lower()方法转成小写,比如‘GET’变成‘get’,其实就是根据不同的请求方法获取类视图中对应的请求方法...2.1.3装饰器 给函数视图加装饰器: ? 给类视图加装饰器: 两种方式: 1、直接在url配置手动调用装饰器函数来实现装饰器添加。...为了理解方便,我们先来定义一个为函数视图准备的装饰器(设计装饰器基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图。...视图中装饰 视图中使用为函数视图准备的装饰器,不能直接添加装饰器,需要使用method_decorator将其转换为适用于类视图方法的装饰器。...'view 视图被调用') return HttpResponse('OK') 注意:调试模式下,init部分有可能会被调用两次 2.2.2多个中间件代码执行顺序(了解) 多个中间件,init

    64240

    评论

    关于创建应用以及 Django 的目录结构 建立 Django 博客应用 中已经有过介绍。创建新的应用后一定要记得 settings.py 里注册这个应用,Django 才知道这是一个应用。...我们知道每一个 URL 对应着一个 Django视图函数,于是 Django 调用这个视图函数,我们视图函数中写上处理用户通过表单提交上来的数据的代码,比如验证数据的合法性并且保存数据到数据库中,...return redirect(post) 这个评论视图相比之前的一些视图复杂很多,主要是处理评论的过程更加复杂。具体过程代码中已有详细注释,这里仅就视图中出现一些新的知识点进行讲解。...我们表单的视图函数里传递了一个 form 变量给模板,这个变量就包含了自动生成 HTML 表单的全部数据。 detail.html 中通过 form 来自动生成表单。...显示评论内容 detail 视图函数我们获取了全部评论数据,并通过 comment_list 传递给模板。

    3.1K60

    基于Django signals 信号作用及用法详解

    __()之后被执行 它有两个参数: post_init(sender, instance) sender:同上,创建实例的模型类 instance:创建的实例 3)pre_save() django.db.models.signals.pre_save...这个信号通常是Django内部使用,一般不会被第三方应用使用。...值得一提的是,测试过程中,我们的ready()函数可能不止一次被执行,因此我们要保护我们的信号不要被复制。...如我们使用信号保存模型发送电子邮件,则传递唯一标识符作为dispatch_uid参数,以识别接收函数。这个标识符通常是一个字符串。...”my_unique_identifier”) 如我们注册保存密码需要用到post_save,新建my_signals.py,文件中加入下面代码: from django.db.models.signals

    2.1K20

    视图 vs. 函数视图

    阅读本篇之前,请记住一点「基于类的视图不会替代基于函数的视图」. 介绍 无论是类视图还是基于函数的视图, 最终绑定到 URL Conf 的都是函数. 为什么这么说?...如果我代码里面, 显式的调用类视图必须这样做: Python return MyView.as_view()(request) 为了让代码显示更加自然, 有可读性,你可以这个函数分配给一个变量....你可以django.views.generic引用它们....各种观点 #1 观点 「使用所有的通用视图(GV)」 此观点认为,Django 提供这些通用视图就是让减少开发的效率, 为什么不用呢?...结论 我觉得如果是初学者在做线上项目,不了解面向对象适用函数式编程是个好的选择,无论是对于以后维护还是开发阶段,都能 hold 住。

    2.5K10

    Python后端技术栈(七)--web框架

    我们经常使用 uwsgi/gunicorn 部署 Django/Flask 应用,但是大家思考过一个问题没有,为什么不同的框架可以部署相同的 web 服务器上呢?...比如为什么 Flask/Django 都可以运行在 gunicorn 之上呢? 肯定需要定义一个规范,如果遵守这个规范,就可以让任意的 web 框架运行在相同的 web server 上了。...为了解决这个问题,WSGI 才诞生了。 WSGI 描述 Web Server(Gunicorn/uWSGI)如何与 web 框架(Flask/Django)交互,Web 框架如何处理请求。...如果叫这个你不觉的奇怪吗?这不是层叠样式表吗。 1.恶意用户将代码植入到提供给其他用户使用的页面中,未经转义的恶意代码输出到其他用户的浏览器被执行。...2.用户浏览页面的时候嵌入页面中的脚本(js)会被执行,攻击用户。

    1.7K40

    Django 统一异常处理

    Django 统一异常处理 Django 项目中可以自定义 中间件类 继承 django.middleware.common 下的 MiddlewareMixin 中间件类,重写 process_exception...process_exception 方法介绍 process_exception 方法只有视图函数中出现异常才执行。..., view_kwargs) 视图函数之前,process_request 方法之后执行 process_exception(self, request, exception) 视图函数中出现异常才执行...process_response(self, request, response) 视图函数之后执行 下面一图就能比较好的呈现 django 整个处理流程逻辑 更多的中间件细节可以去 Django...代码块 例如在对数据库进行操作,为了防止数据库发生了意外的异常导致系统崩溃,通常加上 try ... except ...来记录异常信息。然而配置全局异常处理,则可以不用管理。

    1.9K21

    关于“Python”的核心知识点整理大全58

    2处,我们调用了函数logout(), 它要求将request对象作为实参。然后,我们重定向到主页(见3)。 3. 链接到注销视图 现在我们需要添加一个注销链接。...我们将使用Django提供的表单UserCreationForm, 但编写自己的视图函数和模板 1....视图函数register() 注册页面首次被请求视图函数register()需要显示一个空的注册表单,并在用户提交 填写好的注册表单对其进行处理。...函数register() 中,我们检查要响应的是否是POST请求。如果不是,就创建一个UserCreationForm实例,且不给 它提供任何初始数据(见1)。...用户注册,被要求输入密码两次;由于 表单是有效的,我们知道输入的这两个密码是相同的,因此可以使用其中任何一个。在这里,我 们从表单的POST数据中获取与键'password1'相关联的值。

    11910

    Django视图

    处理非 HTTP 形式的报文非常有用,例如:二进制图片、XML,Json等。   但是,如果要处理表单数据的时候,推荐还是使用 request.POST 。...只有当Django 启用会话的支持才可用。 完整的细节参见会话的文档。...类实现django.contrib.auth.models.User 接口,但具有下面几个不同点: id 永远为None。...大部分现代的 JavaScript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。   ...301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎抓取新内容的同时也将旧的网址交换为重定向之后的网址;   302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址

    1.7K10

    第 14 篇:交流的桥梁“评论功能”—— HelloDjango 系列教程

    此外, 博客从“裸奔”到“有皮肤”[3] 中提过,所有模型的字段都接受一个 verbose_name 参数(大部分是第一个位置参数),django 根据模型的定义自动生成表单,会使用这个参数的值作为表单字段的...我们知道每一个 URL 对应着一个 django视图函数,于是 django 调用这个视图函数,我们视图函数中写上处理用户通过表单提交上来的数据的代码,比如验证数据的合法性并且保存数据到数据库中,...', context=context) 这个评论视图相比之前的一些视图复杂很多,主要是处理评论的过程更加复杂。...具体过程代码中已有详细注释,这里仅就视图中出现一些新的知识点进行讲解。...因为视图函数 comment 中的表单实例是绑定用户提交的评论数据,以及对数据进行过合法性校验的表单,因此当 django 渲染这个表单,会连带渲染用户已经填写的表单数据以及数据不合法的错误提示信息

    1.7K20

    django之评论系统及多级评论

    关于创建应用以及 Django 的目录结构 建立 Django 博客应用 中已经有过介绍。创建新的应用后一定要记得 settings.py 里注册这个应用,Django 才知道这是一个应用。...我们知道每一个 URL 对应着一个 Django视图函数,于是 Django 调用这个视图函数,我们视图函数中写上处理用户通过表单提交上来的数据的代码,比如验证数据的合法性并且保存数据到数据库中,...return redirect(post) 这个评论视图相比之前的一些视图复杂很多,主要是处理评论的过程更加复杂。具体过程代码中已有详细注释,这里仅就视图中出现一些新的知识点进行讲解。...我们表单的视图函数里传递了一个 form 变量给模板,这个变量就包含了自动生成 HTML 表单的全部数据。 detail.html 中通过 form 来自动生成表单。...显示评论内容 detail 视图函数我们获取了全部评论数据,并通过 comment_list 传递给模板。

    6.9K61

    django 1.8 官方文档翻译: 1-2-4 编写你的第一个Django应用,第4部分

    当你创建一个表单为了修改服务器端的数据,请使用 method=”post” 。这不是 Django 特定的技巧;这是优秀的 Web 开发实践。...总之,所有的 POST form 针对内部的 URLs 都应该使用 {% csrf_token %} 模板标签。 现在,让我们来创建一个 Django 视图来处理提交的数据。 记得吗?...请注意 Django 也同样的提供通过 request.GET 获取 GET 数据的方法 – 但是代码中我们明确的使用了 request.POST 方法,以确保数据是通过 POST 方法来修改的。...这个技巧不是特定于 Django 的;它是优秀的 Web 开发实践。 本例中,我们 HttpResponseRedirect 的构造方法中使用了 reverse() 函数。...修正 URL 处理到对应的新视图。 请继续阅读了解详细的信息。 为什么要重构代码?

    1.5K10
    领券