def test_modify_avatar_by_teacher(self):
# Teacher role not allowed to modify avatar.
username = "test1"
password = "123123"
user = User.objects.get(username=username)
change_profile_perm = Permission.objects.get(name='Can change profile')
user.user_permissions.add(change_profile_perm)
user.save()
client = Client()
client.login(username=username, password=password)
request_url = "/api/v1/profiles/%d" % (user.profile.pk,)
img_name = 'img0' # NOTE: seq is 0 not 1, seq of the user 'parent1'
img_path = os.path.join(
app_path, 'migrations', 'avatars', img_name + '.jpg')
# print(img_path)
img_fd = open(img_path, 'rb')
data = {'avatar': img_fd}
encoded_data = encode_multipart(BOUNDARY, data)
response = client.patch(request_url, content_type=MULTIPART_CONTENT,
data=encoded_data)
self.assertEqual(409, response.status_code)
python类MULTIPART_CONTENT的实例源码
def add_images(self, product_ids, images):
domain = self.shop.domain
headers = {'Content-Type': MULTIPART_CONTENT,
'Authorization': self.shop.authheader}
for i, p_images in enumerate(images):
# TODO: why sometimes index does not exist?
if i >= len(product_ids):
send_email.delay('mail/error', {'domain': domain, 'message': str(product_ids),
'data_list': '',
'full_data': ''}, "Add images error")
break
product_id = product_ids[i]
for image in p_images:
data = encode_multipart(BOUNDARY, {'image': image})
req = urllib2.Request(smart_str("http://%s/api/images/products/%s" % (domain, product_id)),
headers=headers, data=smart_str(data))
urllib2.urlopen(req)
self.make_first_image_default(product_ids, headers)
def test_modify_user_avatar(self):
username = "parent1"
password = "123123"
user = User.objects.get(username=username)
change_profile_perm = Permission.objects.get(name='Can change profile')
user.user_permissions.add(change_profile_perm)
user.save()
client = Client()
client.login(username=username, password=password)
request_url = "/api/v1/profiles/%d" % (user.profile.pk,)
img_name = 'img0' # NOTE: seq is 0 not 1, seq of the user 'parent1'
img_path = os.path.join(
app_path, 'migrations', 'avatars', img_name + '.jpg')
# print(img_path)
img_fd = open(img_path, 'rb')
data = {'avatar': img_fd}
encoded_data = encode_multipart(BOUNDARY, data)
response = client.patch(request_url, content_type=MULTIPART_CONTENT,
data=encoded_data)
self.assertEqual(200, response.status_code)
json_ret = json.loads(response.content.decode())
self.assertEqual(json_ret["done"], "true")
profile_after = Profile.objects.get(user=user)
# print(profile_after.avatar_url())
self.assertTrue(profile_after.avatar.url.find(img_name) >= 0)
def test_force_json(self):
"""
We should only allow JSON content-types in this view and reject others
"""
response = self.client.post('/api/pulse/entries/', content_type=MULTIPART_CONTENT)
self.assertEqual(response.status_code, status.HTTP_415_UNSUPPORTED_MEDIA_TYPE)
def post(self, url, data=None, content_type=MULTIPART_CONTENT, **kwargs):
response = self.client.post(
url, data, content_type, HTTP_HOST=settings.PROJECT_HOST, **kwargs)
response.html = self._get_html(response)
return response
def post_partial(self, url, data=None, content_type=MULTIPART_CONTENT):
url = '{}?partial=true'.format(url)
return self.post(
url, data, content_type, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
def transparent_encode_multipart(func):
"""Wrap an HTTP client method, transparently encoding multipart data.
This wraps some of Django's `Client` HTTP verb methods -- delete, options,
patch, put -- so they accept a dict of data to be sent as part of the
request body, in MIME multipart encoding.
This also accepts an optional dict of query parameters (as `query`) to be
encoded as a query string and appended to the given path.
Since Django 1.5, these HTTP verb methods require data in the form of a
byte string. The application (that's us) needs to take care of MIME
encoding.
"""
@wraps(func)
def maybe_encode_multipart(
self, path, data=b"", content_type=None, secure=False, query=None,
**extra):
if isinstance(data, bytes):
if content_type is None:
content_type = 'application/octet-stream'
elif content_type is None:
content_type = client.MULTIPART_CONTENT
data = client.encode_multipart(client.BOUNDARY, data)
else:
raise TypeError(
"Cannot combine data (%r) with content-type (%r)."
% (data, content_type))
if query is not None:
query = urlencode(query, doseq=True)
path = path + ("&" if "?" in path else "?") + query
return func(self, path, data, content_type, secure, **extra)
return maybe_encode_multipart