我在学习django,使用Pinax Likes时出现405错误
I am learning django, when I use Pinax Likes, there is a 405 error
Django 2.2.1
当我使用Pinax Likes(https://github.com/pinax/pinax-likes)时,出现405错误。
步骤如下:
pip3 install pinax-likes
已将 'pinax.likes',
添加到项目的 settings.py 文件中,
然后添加:
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文件,
python manage.py makemigrations app && python manage.py migrate && python manage.py runserver 0.0.0.0:8000
打开http://127.0.0.1:8000/post/13/, like icon appears, when clicked the icon(url: http://127.0.0.1:8000/like/14:13/),显示如下:
HTTP ERROR 405
,
控制台显示如下信息:
Method Not Allowed (GET): /likes/like/14:13/
Method Not Allowed: /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>
点击图标后,控制台显示如下信息:
Forbidden (CSRF token missing or incorrect.): /likes/like/14:13/
[29/May/2019 10:01:31] "POST /likes/like/14:13/ HTTP/1.1" 403 2513
错误的步骤是什么?谢谢!
我看不出 pinax-likes 小部件如何实际使用当前代码。它坏了。我看到你打开了一个问题,如果有人仍在积极维护它,他们可能会修复它。或者您可以修复它并提出拉取请求。
{% likes_widget %}
有两个问题:
没有 ajax 就无法工作,因为它只是一个 link,即它会向您的视图发送 GET 请求。但是视图需要 POST 请求,这是合乎逻辑的,因为喜欢会更改数据库,因此它 应该 是 POST。因此,如果没有 ajax,视图将引发 405 错误。
它使用 eldarion-ajax 发出 ajax POST 请求,但由于它又只是一个 a.click
事件,它不会 post 任何数据,即它不是 post CSRF 令牌。该视图不允许缺少标记(它没有 @csrf_exempt 装饰器),因此它会抛出 403 错误。
现在我看到的唯一方法是编写自己的 HTML and/or ajax 而不是使用 likes_widget.
您可以将点赞按钮包裹在表单中,并将点赞按钮替换为提交表单的 <button>
(而不是 <a>
标签)。这样,您可以在表单中包含 {% csrf_token %}
标记,并且 post 将起作用。这将刷新页面。
您可以编写自己的 ajax 调用来处理对相同视图的点赞按钮和 post 的点击,并在数据中包含 csrftoken post编辑。
这实现起来相当简单,您可以使用现有的类似 pinax 的视图,所以这只是您 HTML 模板中的一个更改。
Django 2.2.1
当我使用Pinax Likes(https://github.com/pinax/pinax-likes)时,出现405错误。
步骤如下:
pip3 install pinax-likes
已将
'pinax.likes',
添加到项目的 settings.py 文件中, 然后添加:
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文件,
python manage.py makemigrations app && python manage.py migrate && python manage.py runserver 0.0.0.0:8000
打开http://127.0.0.1:8000/post/13/, like icon appears, when clicked the icon(url: http://127.0.0.1:8000/like/14:13/),显示如下:
HTTP ERROR 405
,
控制台显示如下信息:
Method Not Allowed (GET): /likes/like/14:13/ Method Not Allowed: /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>
点击图标后,控制台显示如下信息:
Forbidden (CSRF token missing or incorrect.): /likes/like/14:13/ [29/May/2019 10:01:31] "POST /likes/like/14:13/ HTTP/1.1" 403 2513
错误的步骤是什么?谢谢!
我看不出 pinax-likes 小部件如何实际使用当前代码。它坏了。我看到你打开了一个问题,如果有人仍在积极维护它,他们可能会修复它。或者您可以修复它并提出拉取请求。
{% likes_widget %}
有两个问题:
没有 ajax 就无法工作,因为它只是一个 link,即它会向您的视图发送 GET 请求。但是视图需要 POST 请求,这是合乎逻辑的,因为喜欢会更改数据库,因此它 应该 是 POST。因此,如果没有 ajax,视图将引发 405 错误。
它使用 eldarion-ajax 发出 ajax POST 请求,但由于它又只是一个
a.click
事件,它不会 post 任何数据,即它不是 post CSRF 令牌。该视图不允许缺少标记(它没有 @csrf_exempt 装饰器),因此它会抛出 403 错误。
现在我看到的唯一方法是编写自己的 HTML and/or ajax 而不是使用 likes_widget.
您可以将点赞按钮包裹在表单中,并将点赞按钮替换为提交表单的
<button>
(而不是<a>
标签)。这样,您可以在表单中包含{% csrf_token %}
标记,并且 post 将起作用。这将刷新页面。您可以编写自己的 ajax 调用来处理对相同视图的点赞按钮和 post 的点击,并在数据中包含 csrftoken post编辑。
这实现起来相当简单,您可以使用现有的类似 pinax 的视图,所以这只是您 HTML 模板中的一个更改。