Python MultiPartParserError:-无效边界
我正试图使用Python请求模块向django rest应用程序发送一些数据和文件,但出现以下错误Python MultiPartParserError:-无效边界,python,django,django-rest-framework,python-requests,Python,Django,Django Rest Framework,Python Requests,我正试图使用Python请求模块向django rest应用程序发送一些数据和文件,但出现以下错误 raise MultiPartParserError('Invalid boundary in multipart: %s' % boundary) MultiPartParserError: Invalid boundary in multipart: None 代码:- import requests payload={'admins':[ {
raise MultiPartParserError('Invalid boundary in multipart: %s' % boundary)
MultiPartParserError: Invalid boundary in multipart: None
代码:-
import requests
payload={'admins':[
{'first_name':'john'
,'last_name':'white'
,'job_title':'CEO'
,'email':'test1@gmail.com'
},
{'first_name':'lisa'
,'last_name':'markel'
,'job_title':'CEO'
,'email':'test2@gmail.com'
}
],
'company-detail':{'description':'We are a renowned engineering company'
,'size':'1-10'
,'industry':'Engineering'
,'url':'http://try.com'
,'logo':''
,'addr1':'1280 wick ter'
,'addr2':'1600'
,'city':'rkville'
,'state':'md'
,'zip_cd':'12000'
,'phone_number_1':'408-393-254'
,'phone_number_2':'408-393-221'
,'company_name':'GOOGLE'}
}
files = {'upload_file':open('./test.py','rb')}
import json
headers = {'content-type' : 'application/json'}
headers = {'content-type' : 'multipart/form-data'}
#r = requests.post('http://127.0.0.1:8080/api/create-company-profile/',data=json.dumps(payload),headers=headers,files=files)
r = requests.post('http://127.0.0.1:8080/api/create-company-profile/',data=payload,headers=headers,files=files)
print r.status_code
print r.text
Django代码:-
class CompanyCreateApiView(CreateAPIView):
parser_classes = (MultiPartParser, FormParser,)
def post(self, request, *args, **kwargs):
print 'request ==', request.data
为了使用
请求
,我必须在django项目中禁用csrf令牌
,否则我在发送post请求时出错:
CSRF验证失败。请求被中止
您正在看到此消息
因为此站点在提交表单时需要CSRF cookie。这
出于安全原因,需要cookie,以确保浏览器
没有被第三方劫持
settings.py:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
接下来,您的负载不是json数据。json数据是一个字符串,但您的负载是一个python字典。而且,您不能只在字典中加引号,因为json数据不能包含单引号——您只能使用单引号。因此,您需要将python字典转换为json
以下是请求
客户端:
import requests
import json
from io import StringIO
my_dict = {
'admins': [
{'first_name':'john'
,'last_name':'white'
,'job_title':'CEO'
,'email':'test1@gmail.com'
},
{'first_name':'lisa'
,'last_name':'markel'
,'job_title':'CEO'
,'email':'test2@gmail.com'
}
],
'company-detail': {
'description': 'We are a renowned engineering company'
,'size':'1-10'
,'industry':'Engineering'
,'url':'http://try.com'
,'logo':''
,'addr1':'1280 wick ter'
,'addr2':'1600'
,'city':'rkville'
,'state':'md'
,'zip_cd':'12000'
,'phone_number_1':'408-393-254'
,'phone_number_2':'408-393-221'
,'company_name':'GOOGLE'
}
}
url = 'http://localhost:8000/myapp/upload/'
#StringIO creates a file-like object in memory, rather than on disk:
with StringIO(json.dumps(my_dict)) as json_file, open("data.txt", 'rb') as data_file:
myfiles = [
("mydata", ("data.txt", data_file, "text/plain")),
("myjson", ("json.json", json_file, "application/json")),
]
r = requests.post(url, files=myfiles)
print(r.text)
请参阅请求
文档部分
这里有一个基于django类的视图(尽管不是django Rest框架
class视图):
客户端窗口中的输出:
django186p34)~/python_programs$ python django_client.py
thanks
(django186p34)~/python_programs$
django服务器窗口中的输出:
...
...
Quit the server with CONTROL-C.
<MultiValueDict: {'myjson': [<InMemoryUploadedFile: json.json (application/json)>],
'mydata': [<InMemoryUploadedFile: data.txt (text/plain)>]}>
**************************************************
myjson
b'{"admins": [{"job_title": "CEO", "last_name": "white", "first_name": "john", "email": "test1@gmail.com"},
{"job_title": "CEO", "last_name": "markel", "first_name": "lisa", "email": "test2@gmail.com"}], "company-detail":
{"description": "We are a renowned engineering company", "city": "rkville", "state": "md", "company_name": "GOOGLE",
"addr1": "1280 wick ter", "url": "http://try.com", "phone_number_2": "408-393-221", "industry": "Engineering", "logo": "", "addr2": "1600",
"phone_number_1": "408-393-254", "size": "1-10", "zip_cd": "12000"}}'
**************************************************
mydata
b'line 1\nline 2\nline 3\nline 4\n'
**************************************************
[16/Dec/2015 07:34:06] "POST /myapp/upload/ HTTP/1.1" 200 6
...
...
Quit the server with CONTROL-C.
<QueryDict: {'hello': ['world']}>
world
<MultiValueDict: {'myfile': [<InMemoryUploadedFile: data.txt ()>]}>
**************************************************
myfile
b'line 1\nline 2\nline 3\nline 4\n'
**************************************************
[16/Dec/2015 8:04:17] "POST /myapp/upload/ HTTP/1.1" 200 6
...
...
Quit the server with CONTROL-C.
data == <QueryDict: {'mydata': [<InMemoryUploadedFile: data.txt (text/plain)>],
'myjson': [<InMemoryUploadedFile: json.json (application/json)>]}>
myjson == b'{"admins": [{"first_name": "john", "last_name": "white", "email": "test1@gmail.com", "job_title": "CEO"},
{"first_name": "lisa", "last_name": "markel", "email": "test2@gmail.com", "job_title": "CEO"}], "company-detail":
{"description": "We are a renowned engineering company", "phone_number_2": "408-393-221", "phone_number_1": "408-393-254",
"addr2": "1600", "addr1": "1280 wick ter", "logo": "", "size": "1-10", "city": "rkville", "url": "http://try.com",
"industry": "Engineering", "state": "md", "company_name": "GOOGLE", "zip_cd": "12000"}}'
mydata == b'line 1\nline 2\nline 3\nline 4\n'
[18/Dec/2015 13:41:57] "POST /myapp/company/ HTTP/1.1" 200 75
结合这一观点:
from django.http import HttpResponse
from django.views.generic import View
class FileUploadView(View):
def post(self, request):
x = request.POST
print(x)
print(x["hello"])
file_dict = request.FILES
print(file_dict)
print('*' * 50)
for name in file_dict:
print(name)
print(file_dict[name].read())
print('*' * 50)
return HttpResponse('thanks')
我在服务器窗口中获得以下输出:
...
...
Quit the server with CONTROL-C.
<MultiValueDict: {'myjson': [<InMemoryUploadedFile: json.json (application/json)>],
'mydata': [<InMemoryUploadedFile: data.txt (text/plain)>]}>
**************************************************
myjson
b'{"admins": [{"job_title": "CEO", "last_name": "white", "first_name": "john", "email": "test1@gmail.com"},
{"job_title": "CEO", "last_name": "markel", "first_name": "lisa", "email": "test2@gmail.com"}], "company-detail":
{"description": "We are a renowned engineering company", "city": "rkville", "state": "md", "company_name": "GOOGLE",
"addr1": "1280 wick ter", "url": "http://try.com", "phone_number_2": "408-393-221", "industry": "Engineering", "logo": "", "addr2": "1600",
"phone_number_1": "408-393-254", "size": "1-10", "zip_cd": "12000"}}'
**************************************************
mydata
b'line 1\nline 2\nline 3\nline 4\n'
**************************************************
[16/Dec/2015 07:34:06] "POST /myapp/upload/ HTTP/1.1" 200 6
...
...
Quit the server with CONTROL-C.
<QueryDict: {'hello': ['world']}>
world
<MultiValueDict: {'myfile': [<InMemoryUploadedFile: data.txt ()>]}>
**************************************************
myfile
b'line 1\nline 2\nline 3\nline 4\n'
**************************************************
[16/Dec/2015 8:04:17] "POST /myapp/upload/ HTTP/1.1" 200 6
...
...
Quit the server with CONTROL-C.
data == <QueryDict: {'mydata': [<InMemoryUploadedFile: data.txt (text/plain)>],
'myjson': [<InMemoryUploadedFile: json.json (application/json)>]}>
myjson == b'{"admins": [{"first_name": "john", "last_name": "white", "email": "test1@gmail.com", "job_title": "CEO"},
{"first_name": "lisa", "last_name": "markel", "email": "test2@gmail.com", "job_title": "CEO"}], "company-detail":
{"description": "We are a renowned engineering company", "phone_number_2": "408-393-221", "phone_number_1": "408-393-254",
"addr2": "1600", "addr1": "1280 wick ter", "logo": "", "size": "1-10", "city": "rkville", "url": "http://try.com",
"industry": "Engineering", "state": "md", "company_name": "GOOGLE", "zip_cd": "12000"}}'
mydata == b'line 1\nline 2\nline 3\nline 4\n'
[18/Dec/2015 13:41:57] "POST /myapp/company/ HTTP/1.1" 200 75
。。。
...
使用CONTROL-C退出服务器。
世界
**************************************************
我的文件
b'第1行\n第2行\n第3行\n第4行\n'
**************************************************
[16/Dec/2015 8:04:17]“POST/myapp/upload/HTTP/1.1”200 6
为了在字典中允许使用UTF-8字符,在转换为json时必须采取一些额外的步骤。请参阅。我从中使用CreateAPIView
尝试了您的代码。在修复了代码产生的所有初步错误之后,我无法重现边界错误
目录结构:
my_site/
myapp/
views.py
serializers.py
urls.py
models.py
mysite/
settings.py
urls.py
我的应用程序/视图。py:
from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser
from myapp.serializers import CompanySerializer
from myapp.models import Company
class CompanyCreateApiView(CreateAPIView):
parser_classes = (MultiPartParser, FormParser,) #Used to parse the Request.
queryset = Company.objects.all() #The contents of the Response.
serializer_class = CompanySerializer #Determines how the contents of the Response will be converted to json.
#Required. Defined in myapp/serializers.py
def post(self, request, *args, **kwargs):
print('data ==', request.data)
print('myjson ==', request.data["myjson"].read())
print('mydata ==', request.data["mydata"].read())
queryset = self.get_queryset()
serializer = CompanySerializer(queryset, many=True)
return Response(serializer.data)
from rest_framework import serializers
from myapp.models import Company
#Directions for converting a model instance into json:
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company #The model this serializer applies to.
#By default all fields are converted to json.
#To limit which fields should be converted:
fields = ("name", "email")
#Or, if its easier you can do this:
#exclude = ('id',)
from django.conf.urls import url
from . import views
urlpatterns = (
url(r'^company/', views.CompanyCreateApiView.as_view() ),
)
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls) ),
url(r'^myapp/', include("myapp.urls") ),
]
from django.db import models
# Create your models here.
class Company(models.Model):
name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
def __str__(self):
return "{} {}".format(self.name, self.email)
...
...
DEFAULT_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
THIRD_PARTY_APPS = (
'rest_framework',
)
LOCAL_APPS = (
'myapp',
)
INSTALLED_APPS = DEFAULT_APPS + THIRD_PARTY_APPS + LOCAL_APPS
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
#'DEFAULT_PERMISSION_CLASSES': [
# 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
#]
}
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
...
...
import requests
import json
from io import StringIO
my_dict = {
'admins': [
{'first_name':'john'
,'last_name':'white'
,'job_title':'CEO'
,'email':'test1@gmail.com'
},
{'first_name':'lisa'
,'last_name':'markel'
,'job_title':'CEO'
,'email':'test2@gmail.com'
}
],
'company-detail': {
'description': 'We are a renowned engineering company'
,'size':'1-10'
,'industry':'Engineering'
,'url':'http://try.com'
,'logo':''
,'addr1':'1280 wick ter'
,'addr2':'1600'
,'city':'rkville'
,'state':'md'
,'zip_cd':'12000'
,'phone_number_1':'408-393-254'
,'phone_number_2':'408-393-221'
,'company_name':'GOOGLE'
}
}
url = 'http://localhost:8000/myapp/company/'
#StringIO creates a file-like object in memory, rather than on disk:
#python3.4:
#with StringIO(json.dumps(my_dict)) as json_file, open("data.txt", 'rb') as data_file:
#python2.7:
with StringIO(json.dumps(my_dict).decode('utf-8')) as json_file, open("data.txt", 'rb') as data_file:
myfiles = [
("mydata", ("data.txt", data_file, "text/plain")),
("myjson", ("json.json", json_file, "application/json")),
]
r = requests.post(url, files=myfiles)
print(r.status_code)
print(r.text)
myapp/serializers.py:
from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser
from myapp.serializers import CompanySerializer
from myapp.models import Company
class CompanyCreateApiView(CreateAPIView):
parser_classes = (MultiPartParser, FormParser,) #Used to parse the Request.
queryset = Company.objects.all() #The contents of the Response.
serializer_class = CompanySerializer #Determines how the contents of the Response will be converted to json.
#Required. Defined in myapp/serializers.py
def post(self, request, *args, **kwargs):
print('data ==', request.data)
print('myjson ==', request.data["myjson"].read())
print('mydata ==', request.data["mydata"].read())
queryset = self.get_queryset()
serializer = CompanySerializer(queryset, many=True)
return Response(serializer.data)
from rest_framework import serializers
from myapp.models import Company
#Directions for converting a model instance into json:
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company #The model this serializer applies to.
#By default all fields are converted to json.
#To limit which fields should be converted:
fields = ("name", "email")
#Or, if its easier you can do this:
#exclude = ('id',)
from django.conf.urls import url
from . import views
urlpatterns = (
url(r'^company/', views.CompanyCreateApiView.as_view() ),
)
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls) ),
url(r'^myapp/', include("myapp.urls") ),
]
from django.db import models
# Create your models here.
class Company(models.Model):
name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
def __str__(self):
return "{} {}".format(self.name, self.email)
...
...
DEFAULT_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
THIRD_PARTY_APPS = (
'rest_framework',
)
LOCAL_APPS = (
'myapp',
)
INSTALLED_APPS = DEFAULT_APPS + THIRD_PARTY_APPS + LOCAL_APPS
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
#'DEFAULT_PERMISSION_CLASSES': [
# 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
#]
}
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
...
...
import requests
import json
from io import StringIO
my_dict = {
'admins': [
{'first_name':'john'
,'last_name':'white'
,'job_title':'CEO'
,'email':'test1@gmail.com'
},
{'first_name':'lisa'
,'last_name':'markel'
,'job_title':'CEO'
,'email':'test2@gmail.com'
}
],
'company-detail': {
'description': 'We are a renowned engineering company'
,'size':'1-10'
,'industry':'Engineering'
,'url':'http://try.com'
,'logo':''
,'addr1':'1280 wick ter'
,'addr2':'1600'
,'city':'rkville'
,'state':'md'
,'zip_cd':'12000'
,'phone_number_1':'408-393-254'
,'phone_number_2':'408-393-221'
,'company_name':'GOOGLE'
}
}
url = 'http://localhost:8000/myapp/company/'
#StringIO creates a file-like object in memory, rather than on disk:
#python3.4:
#with StringIO(json.dumps(my_dict)) as json_file, open("data.txt", 'rb') as data_file:
#python2.7:
with StringIO(json.dumps(my_dict).decode('utf-8')) as json_file, open("data.txt", 'rb') as data_file:
myfiles = [
("mydata", ("data.txt", data_file, "text/plain")),
("myjson", ("json.json", json_file, "application/json")),
]
r = requests.post(url, files=myfiles)
print(r.status_code)
print(r.text)
myapp/url.py:
from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser
from myapp.serializers import CompanySerializer
from myapp.models import Company
class CompanyCreateApiView(CreateAPIView):
parser_classes = (MultiPartParser, FormParser,) #Used to parse the Request.
queryset = Company.objects.all() #The contents of the Response.
serializer_class = CompanySerializer #Determines how the contents of the Response will be converted to json.
#Required. Defined in myapp/serializers.py
def post(self, request, *args, **kwargs):
print('data ==', request.data)
print('myjson ==', request.data["myjson"].read())
print('mydata ==', request.data["mydata"].read())
queryset = self.get_queryset()
serializer = CompanySerializer(queryset, many=True)
return Response(serializer.data)
from rest_framework import serializers
from myapp.models import Company
#Directions for converting a model instance into json:
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company #The model this serializer applies to.
#By default all fields are converted to json.
#To limit which fields should be converted:
fields = ("name", "email")
#Or, if its easier you can do this:
#exclude = ('id',)
from django.conf.urls import url
from . import views
urlpatterns = (
url(r'^company/', views.CompanyCreateApiView.as_view() ),
)
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls) ),
url(r'^myapp/', include("myapp.urls") ),
]
from django.db import models
# Create your models here.
class Company(models.Model):
name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
def __str__(self):
return "{} {}".format(self.name, self.email)
...
...
DEFAULT_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
THIRD_PARTY_APPS = (
'rest_framework',
)
LOCAL_APPS = (
'myapp',
)
INSTALLED_APPS = DEFAULT_APPS + THIRD_PARTY_APPS + LOCAL_APPS
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
#'DEFAULT_PERMISSION_CLASSES': [
# 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
#]
}
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
...
...
import requests
import json
from io import StringIO
my_dict = {
'admins': [
{'first_name':'john'
,'last_name':'white'
,'job_title':'CEO'
,'email':'test1@gmail.com'
},
{'first_name':'lisa'
,'last_name':'markel'
,'job_title':'CEO'
,'email':'test2@gmail.com'
}
],
'company-detail': {
'description': 'We are a renowned engineering company'
,'size':'1-10'
,'industry':'Engineering'
,'url':'http://try.com'
,'logo':''
,'addr1':'1280 wick ter'
,'addr2':'1600'
,'city':'rkville'
,'state':'md'
,'zip_cd':'12000'
,'phone_number_1':'408-393-254'
,'phone_number_2':'408-393-221'
,'company_name':'GOOGLE'
}
}
url = 'http://localhost:8000/myapp/company/'
#StringIO creates a file-like object in memory, rather than on disk:
#python3.4:
#with StringIO(json.dumps(my_dict)) as json_file, open("data.txt", 'rb') as data_file:
#python2.7:
with StringIO(json.dumps(my_dict).decode('utf-8')) as json_file, open("data.txt", 'rb') as data_file:
myfiles = [
("mydata", ("data.txt", data_file, "text/plain")),
("myjson", ("json.json", json_file, "application/json")),
]
r = requests.post(url, files=myfiles)
print(r.status_code)
print(r.text)
myu站点/url.py:
from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser
from myapp.serializers import CompanySerializer
from myapp.models import Company
class CompanyCreateApiView(CreateAPIView):
parser_classes = (MultiPartParser, FormParser,) #Used to parse the Request.
queryset = Company.objects.all() #The contents of the Response.
serializer_class = CompanySerializer #Determines how the contents of the Response will be converted to json.
#Required. Defined in myapp/serializers.py
def post(self, request, *args, **kwargs):
print('data ==', request.data)
print('myjson ==', request.data["myjson"].read())
print('mydata ==', request.data["mydata"].read())
queryset = self.get_queryset()
serializer = CompanySerializer(queryset, many=True)
return Response(serializer.data)
from rest_framework import serializers
from myapp.models import Company
#Directions for converting a model instance into json:
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company #The model this serializer applies to.
#By default all fields are converted to json.
#To limit which fields should be converted:
fields = ("name", "email")
#Or, if its easier you can do this:
#exclude = ('id',)
from django.conf.urls import url
from . import views
urlpatterns = (
url(r'^company/', views.CompanyCreateApiView.as_view() ),
)
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls) ),
url(r'^myapp/', include("myapp.urls") ),
]
from django.db import models
# Create your models here.
class Company(models.Model):
name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
def __str__(self):
return "{} {}".format(self.name, self.email)
...
...
DEFAULT_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
THIRD_PARTY_APPS = (
'rest_framework',
)
LOCAL_APPS = (
'myapp',
)
INSTALLED_APPS = DEFAULT_APPS + THIRD_PARTY_APPS + LOCAL_APPS
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
#'DEFAULT_PERMISSION_CLASSES': [
# 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
#]
}
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
...
...
import requests
import json
from io import StringIO
my_dict = {
'admins': [
{'first_name':'john'
,'last_name':'white'
,'job_title':'CEO'
,'email':'test1@gmail.com'
},
{'first_name':'lisa'
,'last_name':'markel'
,'job_title':'CEO'
,'email':'test2@gmail.com'
}
],
'company-detail': {
'description': 'We are a renowned engineering company'
,'size':'1-10'
,'industry':'Engineering'
,'url':'http://try.com'
,'logo':''
,'addr1':'1280 wick ter'
,'addr2':'1600'
,'city':'rkville'
,'state':'md'
,'zip_cd':'12000'
,'phone_number_1':'408-393-254'
,'phone_number_2':'408-393-221'
,'company_name':'GOOGLE'
}
}
url = 'http://localhost:8000/myapp/company/'
#StringIO creates a file-like object in memory, rather than on disk:
#python3.4:
#with StringIO(json.dumps(my_dict)) as json_file, open("data.txt", 'rb') as data_file:
#python2.7:
with StringIO(json.dumps(my_dict).decode('utf-8')) as json_file, open("data.txt", 'rb') as data_file:
myfiles = [
("mydata", ("data.txt", data_file, "text/plain")),
("myjson", ("json.json", json_file, "application/json")),
]
r = requests.post(url, files=myfiles)
print(r.status_code)
print(r.text)
myapp/models.py:
from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser
from myapp.serializers import CompanySerializer
from myapp.models import Company
class CompanyCreateApiView(CreateAPIView):
parser_classes = (MultiPartParser, FormParser,) #Used to parse the Request.
queryset = Company.objects.all() #The contents of the Response.
serializer_class = CompanySerializer #Determines how the contents of the Response will be converted to json.
#Required. Defined in myapp/serializers.py
def post(self, request, *args, **kwargs):
print('data ==', request.data)
print('myjson ==', request.data["myjson"].read())
print('mydata ==', request.data["mydata"].read())
queryset = self.get_queryset()
serializer = CompanySerializer(queryset, many=True)
return Response(serializer.data)
from rest_framework import serializers
from myapp.models import Company
#Directions for converting a model instance into json:
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company #The model this serializer applies to.
#By default all fields are converted to json.
#To limit which fields should be converted:
fields = ("name", "email")
#Or, if its easier you can do this:
#exclude = ('id',)
from django.conf.urls import url
from . import views
urlpatterns = (
url(r'^company/', views.CompanyCreateApiView.as_view() ),
)
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls) ),
url(r'^myapp/', include("myapp.urls") ),
]
from django.db import models
# Create your models here.
class Company(models.Model):
name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
def __str__(self):
return "{} {}".format(self.name, self.email)
...
...
DEFAULT_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
THIRD_PARTY_APPS = (
'rest_framework',
)
LOCAL_APPS = (
'myapp',
)
INSTALLED_APPS = DEFAULT_APPS + THIRD_PARTY_APPS + LOCAL_APPS
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
#'DEFAULT_PERMISSION_CLASSES': [
# 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
#]
}
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
...
...
import requests
import json
from io import StringIO
my_dict = {
'admins': [
{'first_name':'john'
,'last_name':'white'
,'job_title':'CEO'
,'email':'test1@gmail.com'
},
{'first_name':'lisa'
,'last_name':'markel'
,'job_title':'CEO'
,'email':'test2@gmail.com'
}
],
'company-detail': {
'description': 'We are a renowned engineering company'
,'size':'1-10'
,'industry':'Engineering'
,'url':'http://try.com'
,'logo':''
,'addr1':'1280 wick ter'
,'addr2':'1600'
,'city':'rkville'
,'state':'md'
,'zip_cd':'12000'
,'phone_number_1':'408-393-254'
,'phone_number_2':'408-393-221'
,'company_name':'GOOGLE'
}
}
url = 'http://localhost:8000/myapp/company/'
#StringIO creates a file-like object in memory, rather than on disk:
#python3.4:
#with StringIO(json.dumps(my_dict)) as json_file, open("data.txt", 'rb') as data_file:
#python2.7:
with StringIO(json.dumps(my_dict).decode('utf-8')) as json_file, open("data.txt", 'rb') as data_file:
myfiles = [
("mydata", ("data.txt", data_file, "text/plain")),
("myjson", ("json.json", json_file, "application/json")),
]
r = requests.post(url, files=myfiles)
print(r.status_code)
print(r.text)
我的网站/设置。py:
from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser
from myapp.serializers import CompanySerializer
from myapp.models import Company
class CompanyCreateApiView(CreateAPIView):
parser_classes = (MultiPartParser, FormParser,) #Used to parse the Request.
queryset = Company.objects.all() #The contents of the Response.
serializer_class = CompanySerializer #Determines how the contents of the Response will be converted to json.
#Required. Defined in myapp/serializers.py
def post(self, request, *args, **kwargs):
print('data ==', request.data)
print('myjson ==', request.data["myjson"].read())
print('mydata ==', request.data["mydata"].read())
queryset = self.get_queryset()
serializer = CompanySerializer(queryset, many=True)
return Response(serializer.data)
from rest_framework import serializers
from myapp.models import Company
#Directions for converting a model instance into json:
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company #The model this serializer applies to.
#By default all fields are converted to json.
#To limit which fields should be converted:
fields = ("name", "email")
#Or, if its easier you can do this:
#exclude = ('id',)
from django.conf.urls import url
from . import views
urlpatterns = (
url(r'^company/', views.CompanyCreateApiView.as_view() ),
)
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls) ),
url(r'^myapp/', include("myapp.urls") ),
]
from django.db import models
# Create your models here.
class Company(models.Model):
name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
def __str__(self):
return "{} {}".format(self.name, self.email)
...
...
DEFAULT_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
THIRD_PARTY_APPS = (
'rest_framework',
)
LOCAL_APPS = (
'myapp',
)
INSTALLED_APPS = DEFAULT_APPS + THIRD_PARTY_APPS + LOCAL_APPS
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
#'DEFAULT_PERMISSION_CLASSES': [
# 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
#]
}
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
...
...
import requests
import json
from io import StringIO
my_dict = {
'admins': [
{'first_name':'john'
,'last_name':'white'
,'job_title':'CEO'
,'email':'test1@gmail.com'
},
{'first_name':'lisa'
,'last_name':'markel'
,'job_title':'CEO'
,'email':'test2@gmail.com'
}
],
'company-detail': {
'description': 'We are a renowned engineering company'
,'size':'1-10'
,'industry':'Engineering'
,'url':'http://try.com'
,'logo':''
,'addr1':'1280 wick ter'
,'addr2':'1600'
,'city':'rkville'
,'state':'md'
,'zip_cd':'12000'
,'phone_number_1':'408-393-254'
,'phone_number_2':'408-393-221'
,'company_name':'GOOGLE'
}
}
url = 'http://localhost:8000/myapp/company/'
#StringIO creates a file-like object in memory, rather than on disk:
#python3.4:
#with StringIO(json.dumps(my_dict)) as json_file, open("data.txt", 'rb') as data_file:
#python2.7:
with StringIO(json.dumps(my_dict).decode('utf-8')) as json_file, open("data.txt", 'rb') as data_file:
myfiles = [
("mydata", ("data.txt", data_file, "text/plain")),
("myjson", ("json.json", json_file, "application/json")),
]
r = requests.post(url, files=myfiles)
print(r.status_code)
print(r.text)
注意,我不必禁用csrf令牌
请求\u client.py:
from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser
from myapp.serializers import CompanySerializer
from myapp.models import Company
class CompanyCreateApiView(CreateAPIView):
parser_classes = (MultiPartParser, FormParser,) #Used to parse the Request.
queryset = Company.objects.all() #The contents of the Response.
serializer_class = CompanySerializer #Determines how the contents of the Response will be converted to json.
#Required. Defined in myapp/serializers.py
def post(self, request, *args, **kwargs):
print('data ==', request.data)
print('myjson ==', request.data["myjson"].read())
print('mydata ==', request.data["mydata"].read())
queryset = self.get_queryset()
serializer = CompanySerializer(queryset, many=True)
return Response(serializer.data)
from rest_framework import serializers
from myapp.models import Company
#Directions for converting a model instance into json:
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company #The model this serializer applies to.
#By default all fields are converted to json.
#To limit which fields should be converted:
fields = ("name", "email")
#Or, if its easier you can do this:
#exclude = ('id',)
from django.conf.urls import url
from . import views
urlpatterns = (
url(r'^company/', views.CompanyCreateApiView.as_view() ),
)
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls) ),
url(r'^myapp/', include("myapp.urls") ),
]
from django.db import models
# Create your models here.
class Company(models.Model):
name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
def __str__(self):
return "{} {}".format(self.name, self.email)
...
...
DEFAULT_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
THIRD_PARTY_APPS = (
'rest_framework',
)
LOCAL_APPS = (
'myapp',
)
INSTALLED_APPS = DEFAULT_APPS + THIRD_PARTY_APPS + LOCAL_APPS
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
#'DEFAULT_PERMISSION_CLASSES': [
# 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
#]
}
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
...
...
import requests
import json
from io import StringIO
my_dict = {
'admins': [
{'first_name':'john'
,'last_name':'white'
,'job_title':'CEO'
,'email':'test1@gmail.com'
},
{'first_name':'lisa'
,'last_name':'markel'
,'job_title':'CEO'
,'email':'test2@gmail.com'
}
],
'company-detail': {
'description': 'We are a renowned engineering company'
,'size':'1-10'
,'industry':'Engineering'
,'url':'http://try.com'
,'logo':''
,'addr1':'1280 wick ter'
,'addr2':'1600'
,'city':'rkville'
,'state':'md'
,'zip_cd':'12000'
,'phone_number_1':'408-393-254'
,'phone_number_2':'408-393-221'
,'company_name':'GOOGLE'
}
}
url = 'http://localhost:8000/myapp/company/'
#StringIO creates a file-like object in memory, rather than on disk:
#python3.4:
#with StringIO(json.dumps(my_dict)) as json_file, open("data.txt", 'rb') as data_file:
#python2.7:
with StringIO(json.dumps(my_dict).decode('utf-8')) as json_file, open("data.txt", 'rb') as data_file:
myfiles = [
("mydata", ("data.txt", data_file, "text/plain")),
("myjson", ("json.json", json_file, "application/json")),
]
r = requests.post(url, files=myfiles)
print(r.status_code)
print(r.text)
请求_client.py终端窗口中的输出:
200
[{"name":"GE","email":"ge@ge.com"},{"name":"APPL","email":"appl@appl.com"}]
django服务器窗口中的输出:
...
...
Quit the server with CONTROL-C.
<MultiValueDict: {'myjson': [<InMemoryUploadedFile: json.json (application/json)>],
'mydata': [<InMemoryUploadedFile: data.txt (text/plain)>]}>
**************************************************
myjson
b'{"admins": [{"job_title": "CEO", "last_name": "white", "first_name": "john", "email": "test1@gmail.com"},
{"job_title": "CEO", "last_name": "markel", "first_name": "lisa", "email": "test2@gmail.com"}], "company-detail":
{"description": "We are a renowned engineering company", "city": "rkville", "state": "md", "company_name": "GOOGLE",
"addr1": "1280 wick ter", "url": "http://try.com", "phone_number_2": "408-393-221", "industry": "Engineering", "logo": "", "addr2": "1600",
"phone_number_1": "408-393-254", "size": "1-10", "zip_cd": "12000"}}'
**************************************************
mydata
b'line 1\nline 2\nline 3\nline 4\n'
**************************************************
[16/Dec/2015 07:34:06] "POST /myapp/upload/ HTTP/1.1" 200 6
...
...
Quit the server with CONTROL-C.
<QueryDict: {'hello': ['world']}>
world
<MultiValueDict: {'myfile': [<InMemoryUploadedFile: data.txt ()>]}>
**************************************************
myfile
b'line 1\nline 2\nline 3\nline 4\n'
**************************************************
[16/Dec/2015 8:04:17] "POST /myapp/upload/ HTTP/1.1" 200 6
...
...
Quit the server with CONTROL-C.
data == <QueryDict: {'mydata': [<InMemoryUploadedFile: data.txt (text/plain)>],
'myjson': [<InMemoryUploadedFile: json.json (application/json)>]}>
myjson == b'{"admins": [{"first_name": "john", "last_name": "white", "email": "test1@gmail.com", "job_title": "CEO"},
{"first_name": "lisa", "last_name": "markel", "email": "test2@gmail.com", "job_title": "CEO"}], "company-detail":
{"description": "We are a renowned engineering company", "phone_number_2": "408-393-221", "phone_number_1": "408-393-254",
"addr2": "1600", "addr1": "1280 wick ter", "logo": "", "size": "1-10", "city": "rkville", "url": "http://try.com",
"industry": "Engineering", "state": "md", "company_name": "GOOGLE", "zip_cd": "12000"}}'
mydata == b'line 1\nline 2\nline 3\nline 4\n'
[18/Dec/2015 13:41:57] "POST /myapp/company/ HTTP/1.1" 200 75
。。。
...
使用CONTROL-C退出服务器。
数据==
myjson==b'{“admins”:[{“first_name”:“john”,“last_name”:“white”,“email”:test1@gmail.com“,”职务“:”首席执行官“},
{“名字”:“丽莎”,“姓氏”:“马克”,“电子邮件”:test2@gmail.com“,”职位“:”首席执行官“}],”公司详情“:
{“描述”:“我们是一家著名的工程公司”,“电话号码”2:“408-393-221”,“电话号码”1:“408-393-254”,
“地址2”:“1600”,“地址1”:“1280威克特”,“徽标”:“尺寸”:“1-10”,“城市”:“rkville”,“url”:”http://try.com",
“行业”:“工程”、“州”:“md”、“公司名称”:“谷歌”、“zip_cd”:“12000”}”
mydata==b'第1行\n第2行\n第3行\n第4行\n'
[18/Dec/2015 13:41:57]“POST/myapp/company/HTTP/1.1”200 75
顺便说一句,在开发时使用请求时,阅读django大量html错误响应的方法不那么痛苦:
$ python requests_client.py > error.html (send output to the file error.html)
然后在浏览器中执行以下操作:
File > Open File
然后导航到error.html
。阅读浏览器中的错误描述,然后跟踪django项目中的错误
然后返回终端窗口,按键盘上的向上箭头键返回:
$ python requests_client.py > error.html
点击Return
,然后刷新显示error.html
的浏览器窗口。必要时重复。(不要犯反复刷新浏览器并认为这是在发送新请求的错误——您必须再次运行request_client.py以发送新请求)。好的,我忘记了您的标题。根据:
MIME提供了许多“多部分”类型——对
单个消息正文中的一个或多个实体。
所有多部分类型共享一个公共语法。。。并且必须包含边界参数作为媒体类型的一部分
价值观
以下是包含多部分/表单数据的请求的外观:
POST /myapp/company/ HTTP/1.1
Host: localhost:8000
Content-Length: 265
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.9.0
Connection: keep-alive
Content-Type: multipart/form-data; boundary=63c5979328c44e2c869349443a94200e
--63c5979328c44e2c869349443a94200e
Content-Disposition: form-data; name="hello"
world
--63c5979328c44e2c869349443a94200e
Content-Disposition: form-data; name="mydata"; filename="data.txt"
line 1
line 2
line 3
line 4
--63c5979328c44e2c869349443a94200e--
请参见如何通过边界分隔数据部分:
--63c5979328c44e2c869349443a94200e--
这个想法是使用一些不太可能出现在数据中的边界。请注意,边界包含在请求的内容类型
头中
该请求由以下代码生成:
import requests
myfile = {'mydata': open('data.txt','rb')}
r = requests.post(url,
#headers = myheaders
data = {'hello': 'world'},
files = myfile
)
看起来您在django rest框架中仔细注意了以下注意事项:
注意:在开发客户端应用程序时,请务必确保
在HTTP中发送数据时,您正在设置内容类型标头
请求
如果不设置内容类型,大多数客户端将默认使用
“application/x-www-form-urlencoded”,这可能不是您想要的
但是,当您使用请求
时,如果您自己指定内容类型
标题,则请求
假定您知道自己在做什么,并且不会用它提供的内容类型
标题覆盖内容类型
标题
您没有按要求在内容类型
标题中提供边界。你怎么能?您没有组装请求主体并创建边界来分隔不同的数据段,因此您不可能知道边界是什么
当django rest框架
说明您应该在请求中包含内容类型
头时,真正的意思是:
您或用于创建请求的任何程序都需要包含
内容类型
标题
因此@AChampion在评论中完全正确:让请求
在所有请求
文档之后提供内容类型标题