【问题标题】:I am learning django, when I use Pinax Likes, there is a 405 error我正在学习django,当我使用Pinax Likes时,出现405错误
【发布时间】:2019-10-14 22:30:33
【问题描述】:

Django 2.2.1

当我使用 Pinax Likes(https://github.com/pinax/pinax-likes) 时,出现 405 错误。

步骤如下:

  • pip3 install pinax-likes

  • 在项目的 settings.py 文件中添加了'pinax.likes',, 然后补充:

PINAX_LIKES_LIKABLE_MODELS = {
    "app.Post": {}
}
  • 已添加
re_path(r'^likes/', include(('pinax.likes.urls', 'pinax_likes'), namespace='pinax_likes')),

到项目的 urls.py 文件,

  • 下载https://github.com/pinax/pinax-templates/tree/master/pinax/templates/templates/pinax/likes中的文件,

将这些html文件放入/home/www/venv/templates/pinax/likes/

  • 已添加
{% load pinax_likes_tags %}
{% likes_widget request.user post %}

到 post.html 文件,

控制台显示如下信息:

不允许的方法 (GET):/likes/like/14:13/ 不允许的方法:/likes/like/14:13/ [29/May/2019 10:00:00]“GET /likes/like/14:13/HTTP/1.1”405 0

  • 然后我在base.html中添加了<script src="{% static 'eldarion-ajax.min.js' %}"></script>

点击图标后,控制台显示如下信息:

禁止(CSRF 令牌丢失或不正确。):/likes/like/14:13/ [29/May/2019 10:01:31]“POST /likes/like/14:13/HTTP/1.1”403 2513

哪些步骤有误?谢谢!

【问题讨论】:

  • 您的控制台应显示错误 405 的错误跟踪,请将其粘贴到您的问题中。
  • 更新了问题最后的内容,谢谢
  • 这很奇怪。意味着默认的小部件使用 GET 请求而不是 POST 请求,并且它的 ajax 版本没有设置 csrf 令牌。但是当我在 github 上查找 pinax-likes 的源代码时,我在任何地方都没有看到 widget.html 模板。所以我看不出是什么原因造成的。也许向我们展示您在浏览器中看到的 likes_widget 部分的 html 源代码。
  • _widget.html 文件在这里:github.com/pinax/pinax-templates/tree/master/pinax/templates/…,将这些 html 文件(_like.html、_widget.html、_widget_brief.html)放在 /home/www/venv/templates/pinax/likes/
  • 您应该将模板放在您自己项目的模板目录之一中,在 pinax 目录中,例如my_app/templates/pinax/likes/...,不要修改你的 venv,因为下次你 pip install pinax 更新它时会中断。

标签: python django pinax


【解决方案1】:

我看不出 pinax-likes 小部件如何与当前代码一起实际工作。它坏了。我看到你打开了一个问题,如果有人仍在积极维护它,他们可能会修复它。或者您可以修复它并提出拉取请求。

{% likes_widget %}有两个问题:

  1. 如果没有 ajax,它就无法工作,因为它只是一个链接,即它会向您的视图发送一个 GET 请求。但是视图需要一个 POST 请求,这是合乎逻辑的,因为喜欢会更改数据库,因此它应该是一个 POST。因此,没有 ajax,视图会抛出 405 错误。

  2. 它使用 eldarion-ajax 来发出 ajax POST 请求,但由于这只是一个 a.click 事件,它不会发布任何数据,即它不会发布 CSRF 令牌。该视图不允许丢失令牌(它没有 @csrf_exempt 装饰器),因此会引发 403 错误。

现在我看到的唯一方法是编写自己的 HTML 和/或 ajax,而不是使用 likes_widget。

  1. 您可以将点赞按钮包装在表单中,并将点赞按钮替换为提交表单的<button>(而不是<a> 标记)。这样,您可以在表单中包含 {% csrf_token %} 标记,并且帖子将正常工作。这将刷新页面。

  2. 您可以编写自己的 ajax 调用来处理对赞按钮的点击并发布到同一视图,并将 csrftoken 包含在发布的数据中。

这实现起来相当简单,您可以使用现有的 pinax 样视图,因此只需更改您的 HTML 模板。

【讨论】:

  • 这个问题分析得很详细,我会尝试写html和ajax,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多