序言
公司展现形式是ios和安卓APP开发,利用django做后台服务.
下面整理一下通过APP获取用户上传头像,并存储在本地,然后将头像的地址返回给APP的操作.
1. 配置django的settings
# 配置文件存储目录
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
# 配置浏览器访问文件的地址:http://127.0.0.1:8000/media/...
MEDIA_URL = '/media/'
# 以上表示浏览器传来的url以media开头的,django统一到MEDIA_ROOT配置的目录下去找
2. 配置models模型类
# 服务器IP
MEDIA_ADDR = http://localhost:8000/media/
# 用户表
class UserInfo(models.Model):
id = models.CharField(verbose_name=u'用户ID-用户唯一标识', max_length=50, primary_key=True, auto_created=True,
default=uuid.uuid4, editable=False) # 主键
user_type = models.CharField(verbose_name=u'用户类型', max_length=20, default=u'普通') # 新增类型,普通/会员
username = models.CharField(verbose_name=u'用户名', max_length=100)
id_card = models.CharField(verbose_name=u'身份证', max_length=20)
phone = models.CharField(verbose_name=u'手机号', max_length=20)
avatar = models.ImageField(upload_to='avatar', default='', verbose_name='头像')
def __str__(self):
return self.id
def get_avatar_url(self):
'''返回头像的url'''
return MEDIA_ADDR + str(self.avatar)
class Meta:
db_table = 'UserInfo'
- 注1: upload_to='avatar’上传的目录;
- 注2: get_avatar_url(self)可以直接返回头像的路径;
3. 配置路由urls(必须是项目的主路由)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/user/', include('app01.urls')), # app01是用户相关
url(r'^api/device/', include('deviceApp.urls')), # deviceApp是设备相关
]
# 主路由中:显性告诉django绑定media_url和media_root
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# 然后在app分布式路由中:添加对应的视图函数(一般用户上传的文件单独写在一个视图函数中)
4. 视图函数:上传头像函数
def upload_avatar(request):
'''上传头像'''
try:
appLogger.debug('进入上传头像的接口')
uid = request.POST.get('uid')
appLogger.debug('收到的请求={}'.format(request))
appLogger.debug('收到的文件是={}'.format(request.FILES))
avatar = request.FILES.getlist('file')[0] # 获取头像名称
appLogger.debug('收到的头像是={}'.format(avatar))
try:
user = UserInfo.objects.get(id=uid)
except ObjectDoesNotExist:
return failResultJson(msg='该用户不存在')
# 1. 删除原头像
user.avatar.delete()
# 2. 将传来的头像数据,保存到数据库
user.avatar = avatar
user.save()
# 3. 拼接图片的路径
avatar_addr = user.get_avatar_url()
appLogger.debug('返回的图片链接是={}'.format(avatar_addr))
return successResultJson(data={"avatar": avatar_addr}, msg='修改成功')
except Exception as e:
# 打印异常,并且返回异常数据给前端
return exception_fail_rasie(e=e, request=request)
- 注1: user.avatar.delete()
之所以加上这一步,是为了防止同一个用户上传多个头像,导致冗余,所以,每次用户上传头像时,先删除之前的旧图像; - 注2:
当上传成功之后,头像图片保存在media/avatar/xxx.jpg
- 注3: request.FILES.getlist(‘file’)[0]
Django获取图片的时候,file是个数组,如果每次只传一图片,则默认取数组第一个元素;如果不加[0],则会报错!
5. 视图函数: 显示头像
@log_print('密码登录接口')
def login(request):
'''密码登录接口'''
phone = request.get('phone')
password = request.get('password')
# 捕捉异常,是否存在该用户
try:
person = UserInfo.objects.get(phone=phone)
except ObjectDoesNotExist:
return failResultJson(msg='用户不存在')
else:
# 无异常,则进行登录密码校验
if person.password == password:
data = {
'uid': str(person.id),
'userName': person.username,
'avatar': person.get_avatar_url()
}
return successResultJson(data=data, msg='登录成功')
else:
return failResultJson(msg='登陆失败')
- 注1:
登录成功,就应该将头像的链接返回回去; - 注2:person.get_avatar_url()
直接调用这个用户类的获取头像url的方法就可以拼接出头像图片的地址了