예제 #1
0
파일: member.py 프로젝트: cwyark/v2ex
 def post(self):
     site = GetSite()
     self.session = Session()
     user_agent = detect(self.request)
     template_values = {}
     template_values['site'] = site
     template_values['system_version'] = SYSTEM_VERSION
     member = CheckAuth(self)
     l10n = GetMessages(self, member, site)
     template_values['l10n'] = l10n
     if (member):
         dest = '/settings/avatar'
         timestamp = str(int(time.time()))
         try:
             avatar = self.request.get('avatar')
         except:
             return self.redirect(dest)
         if avatar is None:
             return self.redirect(dest)
         avatar_len = len(avatar)
         if avatar_len == 0:
             return self.redirect(dest)
         avatar_73 = images.resize(avatar, 73, 73)
         avatar_48 = images.resize(avatar, 48, 48)
         avatar_24 = images.resize(avatar, 24, 24)
         # Large 73x73
         q1 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", 'avatar_' + str(member.num) + '_large')
         if (q1.count() == 1):
             avatar_large = q1[0]
             avatar_large.content = db.Blob(avatar_73)
             avatar_large.put()
         else:
             qc1 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", 'avatar.max')
             if (qc1.count() == 1):
                 counter1 = qc1[0]
                 counter1.value = counter1.value + 1
             else:
                 counter1 = Counter()
                 counter1.name = 'avatar.max'
                 counter1.value = 1
             counter1.put()
             avatar_large = Avatar()
             avatar_large.name = 'avatar_' + str(member.num) + '_large'
             avatar_large.content = db.Blob(avatar_73)
             avatar_large.num = counter1.value
             avatar_large.put()
         member.avatar_large_url = '/avatar/' + str(member.num) + '/large?r=' + timestamp
         member.put()
         # Normal 48x48
         q2 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", 'avatar_' + str(member.num) + '_normal')
         if (q2.count() == 1):
             avatar_normal = q2[0]
             avatar_normal.content = db.Blob(avatar_48)
             avatar_normal.put()
         else:
             qc2 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", 'avatar.max')
             if (qc2.count() == 1):
                 counter2 = qc2[0]
                 counter2.value = counter2.value + 1
             else:
                 counter2 = Counter()
                 counter2.name = 'avatar.max'
                 counter2.value = 1
             counter2.put()
             avatar_normal = Avatar()
             avatar_normal.name = 'avatar_' + str(member.num) + '_normal'
             avatar_normal.content = db.Blob(avatar_48)
             avatar_normal.num = counter2.value
             avatar_normal.put()
         member.avatar_normal_url = '/avatar/' + str(member.num) + '/normal?r=' + timestamp
         member.put() 
         # Mini 24x24
         q3 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", 'avatar_' + str(member.num) + '_mini')
         if (q3.count() == 1):
             avatar_mini = q3[0]
             avatar_mini.content = db.Blob(avatar_24)
             avatar_mini.put()
         else:
             qc3 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", 'avatar.max')
             if (qc3.count() == 1):
                 counter3 = qc3[0]
                 counter3.value = counter3.value + 1
             else:
                 counter3 = Counter()
                 counter3.name = 'avatar.max'
                 counter3.value = 1
             counter3.put()
             avatar_mini = Avatar()
             avatar_mini.name = 'avatar_' + str(member.num) + '_mini'
             avatar_mini.content = db.Blob(avatar_24)
             avatar_mini.num = counter3.value
             avatar_mini.put()
         member.avatar_mini_url = '/avatar/' + str(member.num) + '/mini?r=' + timestamp
         member.put()
         # Upload to MobileMe
         if config.mobileme_enabled:
             headers = {'Authorization' : 'Basic ' + base64.b64encode(config.mobileme_username + ':' + config.mobileme_password)}
             host = 'idisk.me.com'
             # Sharding
             timestamp = str(int(time.time()))
             shard = member.num % 31
             root = '/' + config.mobileme_username + '/Web/Sites/v2ex/avatars/' + str(shard)
             root_mini = root + '/mini'
             root_normal = root + '/normal'
             root_large = root + '/large'
             h = httplib.HTTPConnection(host)
             # Mini
             h.request('PUT', root_mini + '/' + str(member.num) + '.png', str(avatar_24), headers)
             response = h.getresponse()
             if response.status == 201 or response.status == 204:
                 member.avatar_mini_url = 'http://web.me.com/' + config.mobileme_username + '/v2ex/avatars/' + str(shard) + '/mini/' + str(member.num) + '.png?r=' + timestamp
             # Normal
             h.request('PUT', root_normal + '/' + str(member.num) + '.png', str(avatar_48), headers)
             response = h.getresponse()
             if response.status == 201 or response.status == 204:
                 member.avatar_normal_url = 'http://web.me.com/' + config.mobileme_username + '/v2ex/avatars/' + str(shard) + '/normal/' + str(member.num) + '.png?r=' + timestamp
             # Large
             h.request('PUT', root_large + '/' + str(member.num) + '.png', str(avatar_73), headers)
             response = h.getresponse()
             if response.status == 201 or response.status == 204:
                 member.avatar_large_url = 'http://web.me.com/' + config.mobileme_username + '/v2ex/avatars/' + str(shard) + '/large/' + str(member.num) + '.png?r=' + timestamp
             member.put()
         # Upload to UpYun
         if config.upyun_enabled:
             u = UpYun(config.upyun_bucket, config.upyun_username, config.upyun_password)
             # Mini
             mini = avatar_24
             u.setContentMD5(md5(mini))
             mini_suffix = '/avatars/mini/' + str(member.num) + '.png'
             r = u.writeFile(mini_suffix, mini, True)
             if r == True:
                 member.avatar_mini_url = 'http://' + config.upyun_bucket + '.b0.upaiyun.com' + mini_suffix + '?r=' + timestamp
             # Normal
             normal = avatar_48
             u.setContentMD5(md5(normal))
             normal_suffix = '/avatars/normal/' + str(member.num) + '.png'
             r = u.writeFile(normal_suffix, normal, True)
             if r == True:
                 member.avatar_normal_url = 'http://' + config.upyun_bucket + '.b0.upaiyun.com' + normal_suffix + '?r=' + timestamp
             # Large
             large = avatar_73
             u.setContentMD5(md5(large))
             large_suffix = '/avatars/large/' + str(member.num) + '.png'
             r = u.writeFile(large_suffix, large, True)
             if r == True:
                 member.avatar_large_url = 'http://' + config.upyun_bucket + '.b0.upaiyun.com' + large_suffix + '?r=' + timestamp
             member.put()
         memcache.set('Member_' + str(member.num), member, 86400 * 14)
         memcache.set('Member::' + member.username_lower, member, 86400 * 14)
         memcache.delete('Avatar::avatar_' + str(member.num) + '_large')
         memcache.delete('Avatar::avatar_' + str(member.num) + '_normal')
         memcache.delete('Avatar::avatar_' + str(member.num) + '_mini')
         self.session['message'] = '新头像设置成功'
         self.redirect('/settings/avatar')
     else:
         self.redirect('/signin')
예제 #2
0
파일: member.py 프로젝트: ninjai/eitime
 def post(self):
     site = GetSite()
     self.session = Session()
     browser = detect(self.request)
     template_values = {}
     template_values["site"] = site
     template_values["system_version"] = SYSTEM_VERSION
     member = CheckAuth(self)
     l10n = GetMessages(self, member, site)
     template_values["l10n"] = l10n
     if member:
         timestamp = str(int(time.time()))
         avatar = self.request.get("avatar")
         avatar_73 = images.resize(avatar, 73, 73)
         avatar_48 = images.resize(avatar, 48, 48)
         avatar_24 = images.resize(avatar, 24, 24)
         # Large 73x73
         q1 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", "avatar_" + str(member.num) + "_large")
         if q1.count() == 1:
             avatar_large = q1[0]
             avatar_large.content = db.Blob(avatar_73)
             avatar_large.put()
         else:
             qc1 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", "avatar.max")
             if qc1.count() == 1:
                 counter1 = qc1[0]
                 counter1.value = counter1.value + 1
             else:
                 counter1 = Counter()
                 counter1.name = "avatar.max"
                 counter1.value = 1
             counter1.put()
             avatar_large = Avatar()
             avatar_large.name = "avatar_" + str(member.num) + "_large"
             avatar_large.content = db.Blob(avatar_73)
             avatar_large.num = counter1.value
             avatar_large.put()
         member.avatar_large_url = "/avatar/" + str(member.num) + "/large?r=" + timestamp
         member.put()
         # Normal 48x48
         q2 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", "avatar_" + str(member.num) + "_normal")
         if q2.count() == 1:
             avatar_normal = q2[0]
             avatar_normal.content = db.Blob(avatar_48)
             avatar_normal.put()
         else:
             qc2 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", "avatar.max")
             if qc2.count() == 1:
                 counter2 = qc2[0]
                 counter2.value = counter2.value + 1
             else:
                 counter2 = Counter()
                 counter2.name = "avatar.max"
                 counter2.value = 1
             counter2.put()
             avatar_normal = Avatar()
             avatar_normal.name = "avatar_" + str(member.num) + "_normal"
             avatar_normal.content = db.Blob(avatar_48)
             avatar_normal.num = counter2.value
             avatar_normal.put()
         member.avatar_normal_url = "/avatar/" + str(member.num) + "/normal?r=" + timestamp
         member.put()
         # Mini 24x24
         q3 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", "avatar_" + str(member.num) + "_mini")
         if q3.count() == 1:
             avatar_mini = q3[0]
             avatar_mini.content = db.Blob(avatar_24)
             avatar_mini.put()
         else:
             qc3 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", "avatar.max")
             if qc3.count() == 1:
                 counter3 = qc3[0]
                 counter3.value = counter3.value + 1
             else:
                 counter3 = Counter()
                 counter3.name = "avatar.max"
                 counter3.value = 1
             counter3.put()
             avatar_mini = Avatar()
             avatar_mini.name = "avatar_" + str(member.num) + "_mini"
             avatar_mini.content = db.Blob(avatar_24)
             avatar_mini.num = counter3.value
             avatar_mini.put()
         member.avatar_mini_url = "/avatar/" + str(member.num) + "/mini?r=" + timestamp
         member.put()
         # Upload to MobileMe
         if config.mobileme_enabled:
             headers = {
                 "Authorization": "Basic "
                 + base64.b64encode(config.mobileme_username + ":" + config.mobileme_password)
             }
             host = "idisk.me.com"
             # Sharding
             timestamp = str(int(time.time()))
             shard = member.num % 31
             root = "/" + config.mobileme_username + "/Web/Sites/v2ex/avatars/" + str(shard)
             root_mini = root + "/mini"
             root_normal = root + "/normal"
             root_large = root + "/large"
             h = httplib.HTTPConnection(host)
             # Mini
             h.request("PUT", root_mini + "/" + str(member.num) + ".png", str(avatar_24), headers)
             response = h.getresponse()
             if response.status == 201 or response.status == 204:
                 member.avatar_mini_url = (
                     "http://web.me.com/"
                     + config.mobileme_username
                     + "/v2ex/avatars/"
                     + str(shard)
                     + "/mini/"
                     + str(member.num)
                     + ".png?r="
                     + timestamp
                 )
             # Normal
             h.request("PUT", root_normal + "/" + str(member.num) + ".png", str(avatar_48), headers)
             response = h.getresponse()
             if response.status == 201 or response.status == 204:
                 member.avatar_normal_url = (
                     "http://web.me.com/"
                     + config.mobileme_username
                     + "/v2ex/avatars/"
                     + str(shard)
                     + "/normal/"
                     + str(member.num)
                     + ".png?r="
                     + timestamp
                 )
             # Large
             h.request("PUT", root_large + "/" + str(member.num) + ".png", str(avatar_73), headers)
             response = h.getresponse()
             if response.status == 201 or response.status == 204:
                 member.avatar_large_url = (
                     "http://web.me.com/"
                     + config.mobileme_username
                     + "/v2ex/avatars/"
                     + str(shard)
                     + "/large/"
                     + str(member.num)
                     + ".png?r="
                     + timestamp
                 )
             member.put()
         memcache.set("Member_" + str(member.num), member, 86400 * 365)
         memcache.set("Member::" + member.username_lower, member, 86400 * 365)
         memcache.delete("Avatar::avatar_" + str(member.num) + "_large")
         memcache.delete("Avatar::avatar_" + str(member.num) + "_normal")
         memcache.delete("Avatar::avatar_" + str(member.num) + "_mini")
         self.session["message"] = "新头像设置成功"
         self.redirect("http://www.eitime.com/settings/avatar")
     else:
         self.redirect("http://www.eitime.com/signin")
예제 #3
0
 def post(self):
     site = GetSite()
     self.session = Session()
     browser = detect(self.request)
     template_values = {}
     template_values['site'] = site
     template_values['system_version'] = SYSTEM_VERSION
     member = CheckAuth(self)
     l10n = GetMessages(self, member, site)
     template_values['l10n'] = l10n
     if (member):
         dest = '/settings/avatar'
         timestamp = str(int(time.time()))
         try:
             avatar = self.request.get('avatar')
         except:
             return self.redirect(dest)
         if avatar is None:
             return self.redirect(dest)
         avatar_len = len(avatar)
         if avatar_len == 0:
             return self.redirect(dest)
         avatar_73 = images.resize(avatar, 73, 73)
         avatar_48 = images.resize(avatar, 48, 48)
         avatar_24 = images.resize(avatar, 24, 24)
         # Large 73x73
         q1 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1",
                          'avatar_' + str(member.num) + '_large')
         if (q1.count() == 1):
             avatar_large = q1[0]
             avatar_large.content = db.Blob(avatar_73)
             avatar_large.put()
         else:
             qc1 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1",
                               'avatar.max')
             if (qc1.count() == 1):
                 counter1 = qc1[0]
                 counter1.value = counter1.value + 1
             else:
                 counter1 = Counter()
                 counter1.name = 'avatar.max'
                 counter1.value = 1
             counter1.put()
             avatar_large = Avatar()
             avatar_large.name = 'avatar_' + str(member.num) + '_large'
             avatar_large.content = db.Blob(avatar_73)
             avatar_large.num = counter1.value
             avatar_large.put()
         member.avatar_large_url = '/avatar/' + str(
             member.num) + '/large?r=' + timestamp
         member.put()
         # Normal 48x48
         q2 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1",
                          'avatar_' + str(member.num) + '_normal')
         if (q2.count() == 1):
             avatar_normal = q2[0]
             avatar_normal.content = db.Blob(avatar_48)
             avatar_normal.put()
         else:
             qc2 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1",
                               'avatar.max')
             if (qc2.count() == 1):
                 counter2 = qc2[0]
                 counter2.value = counter2.value + 1
             else:
                 counter2 = Counter()
                 counter2.name = 'avatar.max'
                 counter2.value = 1
             counter2.put()
             avatar_normal = Avatar()
             avatar_normal.name = 'avatar_' + str(member.num) + '_normal'
             avatar_normal.content = db.Blob(avatar_48)
             avatar_normal.num = counter2.value
             avatar_normal.put()
         member.avatar_normal_url = '/avatar/' + str(
             member.num) + '/normal?r=' + timestamp
         member.put()
         # Mini 24x24
         q3 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1",
                          'avatar_' + str(member.num) + '_mini')
         if (q3.count() == 1):
             avatar_mini = q3[0]
             avatar_mini.content = db.Blob(avatar_24)
             avatar_mini.put()
         else:
             qc3 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1",
                               'avatar.max')
             if (qc3.count() == 1):
                 counter3 = qc3[0]
                 counter3.value = counter3.value + 1
             else:
                 counter3 = Counter()
                 counter3.name = 'avatar.max'
                 counter3.value = 1
             counter3.put()
             avatar_mini = Avatar()
             avatar_mini.name = 'avatar_' + str(member.num) + '_mini'
             avatar_mini.content = db.Blob(avatar_24)
             avatar_mini.num = counter3.value
             avatar_mini.put()
         member.avatar_mini_url = '/avatar/' + str(
             member.num) + '/mini?r=' + timestamp
         member.put()
         # Upload to MobileMe
         if config.mobileme_enabled:
             headers = {
                 'Authorization':
                 'Basic ' + base64.b64encode(config.mobileme_username +
                                             ':' + config.mobileme_password)
             }
             host = 'idisk.me.com'
             # Sharding
             timestamp = str(int(time.time()))
             shard = member.num % 31
             root = '/' + config.mobileme_username + '/Web/Sites/v2ex/avatars/' + str(
                 shard)
             root_mini = root + '/mini'
             root_normal = root + '/normal'
             root_large = root + '/large'
             h = httplib.HTTPConnection(host)
             # Mini
             h.request('PUT', root_mini + '/' + str(member.num) + '.png',
                       str(avatar_24), headers)
             response = h.getresponse()
             if response.status == 201 or response.status == 204:
                 member.avatar_mini_url = 'http://web.me.com/' + config.mobileme_username + '/v2ex/avatars/' + str(
                     shard) + '/mini/' + str(
                         member.num) + '.png?r=' + timestamp
             # Normal
             h.request('PUT', root_normal + '/' + str(member.num) + '.png',
                       str(avatar_48), headers)
             response = h.getresponse()
             if response.status == 201 or response.status == 204:
                 member.avatar_normal_url = 'http://web.me.com/' + config.mobileme_username + '/v2ex/avatars/' + str(
                     shard) + '/normal/' + str(
                         member.num) + '.png?r=' + timestamp
             # Large
             h.request('PUT', root_large + '/' + str(member.num) + '.png',
                       str(avatar_73), headers)
             response = h.getresponse()
             if response.status == 201 or response.status == 204:
                 member.avatar_large_url = 'http://web.me.com/' + config.mobileme_username + '/v2ex/avatars/' + str(
                     shard) + '/large/' + str(
                         member.num) + '.png?r=' + timestamp
             member.put()
         # Upload to UpYun
         if config.upyun_enabled:
             u = UpYun(config.upyun_bucket, config.upyun_username,
                       config.upyun_password)
             # Mini
             mini = avatar_24
             u.setContentMD5(md5(mini))
             mini_suffix = '/avatars/mini/' + str(member.num) + '.png'
             r = u.writeFile(mini_suffix, mini, True)
             if r == True:
                 member.avatar_mini_url = 'http://' + config.upyun_bucket + '.b0.upaiyun.com' + mini_suffix + '?r=' + timestamp
             # Normal
             normal = avatar_48
             u.setContentMD5(md5(normal))
             normal_suffix = '/avatars/normal/' + str(member.num) + '.png'
             r = u.writeFile(normal_suffix, normal, True)
             if r == True:
                 member.avatar_normal_url = 'http://' + config.upyun_bucket + '.b0.upaiyun.com' + normal_suffix + '?r=' + timestamp
             # Large
             large = avatar_73
             u.setContentMD5(md5(large))
             large_suffix = '/avatars/large/' + str(member.num) + '.png'
             r = u.writeFile(large_suffix, large, True)
             if r == True:
                 member.avatar_large_url = 'http://' + config.upyun_bucket + '.b0.upaiyun.com' + large_suffix + '?r=' + timestamp
             member.put()
         memcache.set('Member_' + str(member.num), member, 86400 * 14)
         memcache.set('Member::' + member.username_lower, member,
                      86400 * 14)
         memcache.delete('Avatar::avatar_' + str(member.num) + '_large')
         memcache.delete('Avatar::avatar_' + str(member.num) + '_normal')
         memcache.delete('Avatar::avatar_' + str(member.num) + '_mini')
         self.session['message'] = '新头像设置成功'
         self.redirect('/settings/avatar')
     else:
         self.redirect('/signin')
예제 #4
0
파일: member.py 프로젝트: benmao/v2ex
 def post(self):
     self.session = Session()
     browser = detect(self.request)
     template_values = {}
     template_values['system_version'] = SYSTEM_VERSION
     member = CheckAuth(self)
     if (member):
         avatar = self.request.get('avatar')
         avatar_73 = images.resize(avatar, 73, 73)
         avatar_48 = images.resize(avatar, 48, 48)
         avatar_24 = images.resize(avatar, 24, 24)
         # Large 73x73
         q1 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", 'avatar_' + str(member.num) + '_large')
         if (q1.count() == 1):
             avatar_large = q1[0]
             avatar_large.content = db.Blob(avatar_73)
             avatar_large.put()
         else:
             qc1 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", 'avatar.max')
             if (qc1.count() == 1):
                 counter1 = qc1[0]
                 counter1.value = counter1.value + 1
             else:
                 counter1 = Counter()
                 counter1.name = 'avatar.max'
                 counter1.value = 1
             counter1.put()
             avatar_large = Avatar()
             avatar_large.name = 'avatar_' + str(member.num) + '_large'
             avatar_large.content = db.Blob(avatar_73)
             avatar_large.num = counter1.value
             avatar_large.put()
             member.avatar_large_url = '/avatar/' + str(member.num) + '/large'
             member.put()
         # Normal 48x48
         q2 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", 'avatar_' + str(member.num) + '_normal')
         if (q2.count() == 1):
             avatar_normal = q2[0]
             avatar_normal.content = db.Blob(avatar_48)
             avatar_normal.put()
         else:
             qc2 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", 'avatar.max')
             if (qc2.count() == 1):
                 counter2 = qc2[0]
                 counter2.value = counter2.value + 1
             else:
                 counter2 = Counter()
                 counter2.name = 'avatar.max'
                 counter2.value = 1
             counter2.put()
             avatar_normal = Avatar()
             avatar_normal.name = 'avatar_' + str(member.num) + '_normal'
             avatar_normal.content = db.Blob(avatar_48)
             avatar_normal.num = counter2.value
             avatar_normal.put()
             member.avatar_normal_url = '/avatar/' + str(member.num) + '/normal'
             member.put() 
         # Mini 24x24
         q3 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", 'avatar_' + str(member.num) + '_mini')
         if (q3.count() == 1):
             avatar_mini = q3[0]
             avatar_mini.content = db.Blob(avatar_24)
             avatar_mini.put()
         else:
             qc3 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", 'avatar.max')
             if (qc3.count() == 1):
                 counter3 = qc3[0]
                 counter3.value = counter3.value + 1
             else:
                 counter3 = Counter()
                 counter3.name = 'avatar.max'
                 counter3.value = 1
             counter3.put()
             avatar_mini = Avatar()
             avatar_mini.name = 'avatar_' + str(member.num) + '_mini'
             avatar_mini.content = db.Blob(avatar_24)
             avatar_mini.num = counter3.value
             avatar_mini.put()
             member.avatar_mini_url = '/avatar/' + str(member.num) + '/mini'
             member.put()
         # Upload to MobileMe
         if config.mobileme_enabled:
             headers = {'Authorization' : 'Basic ' + base64.b64encode(config.mobileme_username + ':' + config.mobileme_password)}
             host = 'idisk.me.com'
             # Sharding
             timestamp = str(int(time.time()))
             shard = member.num % 31
             root = '/' + config.mobileme_username + '/Web/Sites/v2ex/avatars/' + str(shard)
             root_mini = root + '/mini'
             root_normal = root + '/normal'
             root_large = root + '/large'
             h = httplib.HTTPConnection(host)
             # Mini
             h.request('PUT', root_mini + '/' + str(member.num) + '.png', str(avatar_24), headers)
             response = h.getresponse()
             if response.status == 201 or response.status == 204:
                 member.avatar_mini_url = 'http://web.me.com/' + config.mobileme_username + '/v2ex/avatars/' + str(shard) + '/mini/' + str(member.num) + '.png?r=' + timestamp
             # Normal
             h.request('PUT', root_normal + '/' + str(member.num) + '.png', str(avatar_48), headers)
             response = h.getresponse()
             if response.status == 201 or response.status == 204:
                 member.avatar_normal_url = 'http://web.me.com/' + config.mobileme_username + '/v2ex/avatars/' + str(shard) + '/normal/' + str(member.num) + '.png?r=' + timestamp
             # Large
             h.request('PUT', root_large + '/' + str(member.num) + '.png', str(avatar_73), headers)
             response = h.getresponse()
             if response.status == 201 or response.status == 204:
                 member.avatar_large_url = 'http://web.me.com/' + config.mobileme_username + '/v2ex/avatars/' + str(shard) + '/large/' + str(member.num) + '.png?r=' + timestamp
             member.put()
         memcache.set('member_' + str(member.num), member, 86400 * 365)
         memcache.delete('Avatar::avatar_' + str(member.num) + '_large')
         memcache.delete('Avatar::avatar_' + str(member.num) + '_normal')
         memcache.delete('Avatar::avatar_' + str(member.num) + '_mini')
         self.session['message'] = '新头像设置成功'
         self.redirect('/settings/avatar')
     else:
         self.redirect('/signin')