前后端分离篇:django实现用户的头像上传和展示

序言

公司展现形式是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的方法就可以拼接出头像图片的地址了
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值