Django 视图被调用两次(双重 GET 请求)

Django view getting called twice (double GET request)

我正在用 Django 创建一个分类网站。单一视图功能处理全球列表、城市列表、仅限易货的全球列表和仅限易货的城市列表。此视图称为 ads

url 模式按以下顺序编写(请注意,尽管每个模式都绑定到相同的 ads 视图,但每个模式都有唯一的名称):

urlpatterns = patterns('',
    url(r'^buy_and_sell/$', ads,name='classified_listing'),
    url(r'^buy_and_sell/barter/$', ads,name='barter_classified_listing'),
    url(r'^buy_and_sell/barter/(?P<city>[\w.@+-]+)/$', ads,name='city_barter_classified_listing'),
    url(r'^buy_and_sell/(?P<city>[\w.@+-]+)/$', ads,name='city_classified_listing'),
)

问题是,当我点击上面列表中名为 classified_listing 的 url 时,函数 ads 被调用 两次 。 IE。这是我在终端中看到的内容:

[14/Jul/2017 14:31:08] "GET /buy_and_sell/ HTTP/1.1" 200 53758 
[14/Jul/2017 14:31:08] "GET /buy_and_sell/None/ HTTP/1.1" 200 32882

这意味着加倍处理。我认为 urls.py returns 第一个 url 模式匹配。我做错了什么,解决这个问题的最佳方法是什么?顺便说一句,所有其他电话都按预期工作(即只有一次)。

注意:如果我遗漏了什么,请询问更多信息。


很好的解释来理解这些类型的事件:https://groups.google.com/d/msg/django-users/CRMMYWix_60/KEIkguUcqxYJ

此问题与 url 模式在 urls.py 中的排列方式无关。

正如问题下评论中指出的那样,这与 HTML 模板中有问题的资产引用有关。

这是什么意思?

例如,在您的终端中尝试 curl -i http://localhost:8000/example/ >> output.txt。然后在您选择的编辑器中打开 output.txt。现在搜索值为 None(或格式错误)的 hrefsrc 属性。这就是创建双重调用的原因之一。这就是我的原因。我删除了这些,双重调用就消失了。

这里有一篇关于如何在您的机器上全面诊断此问题的古老但相关的文章:https://groups.google.com/forum/#!msg/django-users/CRMMYWix_60/KEIkguUcqxYJ

测试愉快。

由于我无法对其他答案发表评论,只是为未来的流浪者补充一点,对我来说 "problem" 的格式正确,但浏览器指示 <iframe src="#"..> 标签。在 Django 服务器上,视图渲染了两次,一次是原始请求,然后是隐藏的 iframe 元素,我在稍后的页面使用中用于一些模态弹出窗口。

清空 src 属性后 <iframe src=""..> 不再启动第二个请求,我的模式工作正常。

解决方案实际上来自 [https://groups.google.com/forum/#!msg/django-users/CRMMYWix_60/KEIkguUcqxYJ][1] 之前已经在答案中发布的 link 在哪里解释:

Note that it's a URI. That means something that is retrieved. Since you've used the value "#fff", that will be interpreted by the browser as a reference to the current page (#fff being an anchor, and not passed to the server). Ergo, a second request is made.

iframe src #(锚点)指示浏览器再次加载相同的 URL,对于我的 iframe 元素。 我确实有几个 style 元素,里面有 #fff 颜色等等,但事实并非如此,因为浏览器足够聪明,可以识别这不是锚点。

使用可用的工具(仅限浏览器)我发现调试起来很容易,并且可以在浏览器开发人员工具的“网络”选项卡上找到这些启动 href/src 属性 - 在 Chrome 中只需单击相应行的发起者 link - 为您提供从发起请求的页面源到相同 URL.

的确切行

我遇到了同样的问题,只是想分享一下我的经验。我在整个应用程序中收到了双重请求,但除此之外,一切似乎都按预期工作。

Daniel Rossman 在评论中指出的内容实际上也适用于我的问题。我的基本模板中有一个 <link rel="shortcut icon" href="#"> 导致了双重请求,因为 # 是对页面本身的引用。一旦我删除它,我就再也没有双重要求了。

希望这个答案可以节省一些调试时间。