Django不接受来自python请求的数据。patch()
我试图通过httpDjango不接受来自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:
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/
)