【问题标题】:Django POST URL errorDjango POST URL 错误
【发布时间】:2012-03-16 14:11:29
【问题描述】:

我正在尝试通过输出 Json 在 Django 中创建一个 REST Api。如果我在终端中使用 curl 发出 POST 请求,我会遇到问题。我得到的错误是

您通过 POST 调用了此 URL,但该 URL 不以斜杠结尾,并且 您设置了 APPEND_SLASH。 Django 无法重定向到斜杠 URL 同时维护 POST 数据。将表单更改为指向 127.0.0.1:8000/add/(注意尾部斜杠),或者在你的 Django 设置中设置 APPEND_SLASH=False。

我的 url.py 是

    from django.conf.urls.defaults import patterns, include, url
import search

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',

    url(r'^query/$', 'search.views.query'),
    url(r'^add/$','search.views.add'),
)

我的观点是

# Create your views here.
from django.http import HttpResponse
from django.template import Context,loader
import memcache
import json

def query(request):
    data=['a','b']

    mc=memcache.Client(['127.0.0.1:11221'],debug=0)
    mc.set("d",data);

    val=mc.get("d")

    return HttpResponse("MEMCACHE: %s<br/>ORIGINAL: %s" % (json.dumps(val),json.dumps(data)) )

def add(request):
    #s=""
    #for data in request.POST:
    #   s="%s,%s" % (s,data)
    s=request.POST['b']
    return HttpResponse("%s" % s)

我知道它没有给 Json,但是当我在终端发出 POST 请求时遇到了上述问题

curl http://127.0.0.1:8000/add/ -d b=2 >> output.html

虽然我是 django 的新手。

【问题讨论】:

    标签: python django restful-architecture


    【解决方案1】:

    首先,确保您将请求发送至http://127.0.0.1/add/ 而不是http://127.0.0.1/add

    其次,您可能还希望通过添加 @csrf_exempt 装饰器来使视图免于 csrf 处理 - 因为您没有从 cURL 发送适当的令牌。

    【讨论】:

      【解决方案2】:

      为了 URL 的一致性,Django 有一个名为APPEND_SLASH 的设置,如果一开始没有以这种方式发送,它总是在 URL 的末尾附加一个斜杠。这可确保始终从该 URL 提供 /my/awesome/url/ 而不是 /my/awesome/url /my/awesome/url/

      然而,Django 通过自动将末尾不带斜线的版本重定向到末尾带斜线的版本来做到这一点。重定向不携带请求的状态,因此当发生这种情况时,您的 POST 数据将被删除。

      您需要做的就是确保在发送 POST 时,将其发送到末尾带有斜线的版本。

      【讨论】:

      • 在我的 curl 请求“curl 127.0.0.1:8000/add -d b=2 >> output.html”中,我在最后用斜杠请求它,但它仍然给我带来问题
      • 我的错误是我有 & 而不是 ?: /add/&param1=abc
      【解决方案3】:

      获取 ==>http://127.0.0.1:8000/create?name=wpwqekhqw/

      对于 POST ==> http://127.0.0.1:8000/create/?name=wpwqekhqw/

      您应该在 POST ... 请求中创建后添加“/”

      【讨论】:

        【解决方案4】:

        在 HTML 中进行更改。 它在我的情况下有效。

        <form action="{% url 'add' %}" method="post">
            {% csrf_token %}
            ...
        </form>
        

        【讨论】:

          【解决方案5】:

          只需从您的网址中删除尾部斜杠

          urlpatterns = [
              path('', views.home, name= 'home'),
              path('contact/', views.contact, name= 'contact'),
              path('about/', views.about, name= 'about')
          ]
          

          改为

          urlpatterns = [
              path('', views.home, name= 'home'),
              path('contact', views.contact, name= 'contact'),
              path('about', views.about, name= 'about')
          ]
          

          在 HTML 表单中添加尾部斜杠

           <form method="POST" action="/contact/">
              {% csrf_token %}
          

          它对我有用

          【讨论】:

            【解决方案6】:

            另一种情况可能会引发与 csrf 或 APPEND_SLASH 解决方案无关的确切错误,如下所示。

             def post(self, request, *args, **kwargs):
                    data= request.data
                    print(data['x'])
            

            如果有效负载正文中不存在“x”,则 data['x'] 将引发错误,在我的情况下,此错误给出了与上述类似的错误消息。 希望这对其他开发者有所帮助。

            【讨论】:

              【解决方案7】:

              去掉 url.py 上的斜线

              例如: 来自:

              url(r'^customer/json/set_person/$', views.json_set_person, name='fog.apps.views.json.set_person'),
              

              收件人:

              url(r'^customer/json/set_person$', views.json_set_person, name='fog.apps.views.json.set_person'),
              

              【讨论】:

                【解决方案8】:

                可以通过“/?”提供带有和不带有斜杠的网址:

                在 django 3.X 中:

                from django.urls import re_path
                re_path(r'^query/?$', 'search.views.query'),
                re_path(r'^add/?$','search.views.add'),
                

                【讨论】:

                  【解决方案9】:

                  就我而言,我在使用simple-ui时忘记添加AjaxAdmin

                  发件人:

                  @admin.register(xxx)
                  class xxxAdmin(ExportActionMixin, GAdmin):
                  

                  收件人:

                  @admin.register(xxx)
                  class xxxAdmin(ExportActionMixin, GAdmin, AjaxAdmin):
                  

                  【讨论】:

                  猜你喜欢
                  • 2023-03-29
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-03-13
                  • 2012-08-02
                  • 2017-03-14
                  • 2012-05-31
                  相关资源
                  最近更新 更多