Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django不接受来自python请求的数据。patch()_Python_Django_Django Rest Framework_Python Requests - Fatal编程技术网

Django不接受来自python请求的数据。patch()

Django不接受来自python请求的数据。patch(),python,django,django-rest-framework,python-requests,Python,Django,Django Rest Framework,Python Requests,我试图通过httpPATCH请求将数据从一个运行python的服务发送到另一个运行Django的使用python的服务 SomeAccount有一个字段appUserId,现在是-1 以下是知道应用程序用户id的某个发件人.py(=77,例如): 当我在GET/someaccounts/1检查项目的值时,它仍然具有appUserId=-1 在调试时,在Django中我得到了请求,但没有任何数据——它只是一个空的dict 以下是我在Django看到的情况: mysite/myapp/url.py:

我试图通过http
PATCH
请求将数据从一个运行python的服务发送到另一个运行Django的使用python的服务

SomeAccount
有一个字段
appUserId
,现在是
-1

以下是知道应用程序用户id的某个发件人.py(
=77
,例如):

当我在
GET/someaccounts/1
检查项目的值时,它仍然具有
appUserId=-1

在调试时,在Django中我得到了请求,但没有任何数据——它只是一个空的dict

以下是我在Django看到的情况:

mysite/myapp/url.py

from django.conf.urls import include, url
from rest_framework import routers
from . import views

router = routers.DefaultRouter()

router.register(r'someaccount', views.SomeAccountViewSet)
# ...
urlpatterns = [
    url(r'^', include(router.urls)),
    # ...
]
from django.db import models
# ...
class SomeAccount(models.Model):
    """
    Some account can include all the data related to some user's account.
    """
    # ...
    appUserId = models.BigIntegerField(blank=True, null=True)
class SomeAccountViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows some accounts to be viewed or edited.
    """
    queryset = SomeAccount.objects.all()
    serializer_class = SomeAccountSerializer
from models import SomeAccount
# ...
class SomeAccountSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()

    class Meta:
        model = SomeAccount
        fields = ('url', 'id', 'appUserId')
        depth = 3
        partial = True

    def update(self, someAccount, account_data):
        if 'appUserId' in account_data:
            someAccount.appUserId = account_data.pop('appUserId')
        someAccount.save()
        return someAccount
mysite/myapp/models.py

from django.conf.urls import include, url
from rest_framework import routers
from . import views

router = routers.DefaultRouter()

router.register(r'someaccount', views.SomeAccountViewSet)
# ...
urlpatterns = [
    url(r'^', include(router.urls)),
    # ...
]
from django.db import models
# ...
class SomeAccount(models.Model):
    """
    Some account can include all the data related to some user's account.
    """
    # ...
    appUserId = models.BigIntegerField(blank=True, null=True)
class SomeAccountViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows some accounts to be viewed or edited.
    """
    queryset = SomeAccount.objects.all()
    serializer_class = SomeAccountSerializer
from models import SomeAccount
# ...
class SomeAccountSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()

    class Meta:
        model = SomeAccount
        fields = ('url', 'id', 'appUserId')
        depth = 3
        partial = True

    def update(self, someAccount, account_data):
        if 'appUserId' in account_data:
            someAccount.appUserId = account_data.pop('appUserId')
        someAccount.save()
        return someAccount
mysite/myapp/views.py

from django.conf.urls import include, url
from rest_framework import routers
from . import views

router = routers.DefaultRouter()

router.register(r'someaccount', views.SomeAccountViewSet)
# ...
urlpatterns = [
    url(r'^', include(router.urls)),
    # ...
]
from django.db import models
# ...
class SomeAccount(models.Model):
    """
    Some account can include all the data related to some user's account.
    """
    # ...
    appUserId = models.BigIntegerField(blank=True, null=True)
class SomeAccountViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows some accounts to be viewed or edited.
    """
    queryset = SomeAccount.objects.all()
    serializer_class = SomeAccountSerializer
from models import SomeAccount
# ...
class SomeAccountSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()

    class Meta:
        model = SomeAccount
        fields = ('url', 'id', 'appUserId')
        depth = 3
        partial = True

    def update(self, someAccount, account_data):
        if 'appUserId' in account_data:
            someAccount.appUserId = account_data.pop('appUserId')
        someAccount.save()
        return someAccount
mysite/myapp/serializers.py

from django.conf.urls import include, url
from rest_framework import routers
from . import views

router = routers.DefaultRouter()

router.register(r'someaccount', views.SomeAccountViewSet)
# ...
urlpatterns = [
    url(r'^', include(router.urls)),
    # ...
]
from django.db import models
# ...
class SomeAccount(models.Model):
    """
    Some account can include all the data related to some user's account.
    """
    # ...
    appUserId = models.BigIntegerField(blank=True, null=True)
class SomeAccountViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows some accounts to be viewed or edited.
    """
    queryset = SomeAccount.objects.all()
    serializer_class = SomeAccountSerializer
from models import SomeAccount
# ...
class SomeAccountSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()

    class Meta:
        model = SomeAccount
        fields = ('url', 'id', 'appUserId')
        depth = 3
        partial = True

    def update(self, someAccount, account_data):
        if 'appUserId' in account_data:
            someAccount.appUserId = account_data.pop('appUserId')
        someAccount.save()
        return someAccount
SomeAccountSerializer
中,当对传入请求进行调试时,我得到以下值:

  • account\u数据:{}
  • 初始数据:
  • someAccount:{'appUserId':-1,'id':1}
我试图通过邮递员谷歌浏览器插件发送相同的值,结果成功了

我还尝试设置
内容类型
标题:

使用
应用程序/x-www-form-urlencoded

requests.patch(
    url, data=data, auth=auth,
    headers={'content-type': 'application/x-www-form-urlencoded'}
)
使用
申请/表格数据

requests.patch(
    url, data=data, auth=auth,
    headers={'content-type': 'application/form-data'}
)
使用
应用程序/json

requests.patch(
    url, json=json.dumps(data), auth=auth,
    headers={'content-type': 'application/json'}
)
没有成功

编辑:
python请求正在正确发送请求。问题可能在于Django是如何处理的。

您应该检查您的网络流量,以确保问题出现在哪里。如果我使用

import requests

app_user_id = 7
auth = ('someusrname', 'somepwd')
data = {'appUserId': app_user_id}
url = 'http://localhost:8000/someaccounts/1'

r = requests.put(url, data=data, auth=auth)
print r.status_code
然后用netcat(nc-l 8000)打开一个本地套接字。我正在获取编码的数据表单:

PUT /someaccounts/1 HTTP/1.1
Host: localhost:8000
Content-Length: 11
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.8.1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Authorization: Basic c29tZXVzcm5hbWU6c29tZXB3ZA==

appUserId=7

只是遇到了同样的问题。缺少URL上的尾部斜杠。当Django用尾随的斜杠重定向到URL时,它似乎删除了补丁的有效负载。

OK,这里也一样。它似乎仍在发送数据。(仅限diff:
用户代理:python请求/2.6.0 CPython/2.7.10 Darwin/14.5.0
)检查请求的响应正文,这可能对问题有一些了解。这也有帮助,谢谢!结果在服务器端和URL上出现了一些错误(我可能在URL字符串的末尾缺少了一个
/
,所以应该是
GET/someaccounts/1/