Django 资源暴露

资源暴露

   Django中允许将所有资源通过url暴露给页面。

   这在用户上传头像时非常有用。

配置声明

   首先我们需要在settings.py下书写如下两句代码。

   当没有该文件夹时自动创建。

# 用户上传文件存储位置
MEDIA_ROOT = os.path.join(BASE_DIR,"media")

模型路径

   我们在ORM中设置了用户头像的上传路径,将自动与配置中声明的文件夹做拼接。

class UserInfo(AbstractUser):
    phone = models.BigIntegerField(verbose_name="手机号", null=True, blank=True)
    avatar = models.FileField(
        verbose_name="头像", upload_to='avatar/', default='avatar/default.png', max_length=64)
        # 自动上传至根目录 media/avatar的文件夹下
        
    # 默认头像
    create_time = models.DateField(
        verbose_name="注册时间", auto_now=False, auto_now_add=True)

    blog = models.OneToOneField(to="Blog", on_delete=models.CASCADE, null=True)

    def __str__(self):
        return "对象-%s" % self.username

路由设置

   最后我们需要将该文件夹下的资源进行暴露,外部才能访问或查看到图片。

#  media配置,暴露接口
from django.views.static import serve
from Blog import settings

# 暴露后端指定文件夹资源(可暴露任意文件夹,在settings中指定)
# 写法固定,后面不加斜杠
url(r"^media/(?P<path>.*)", serve, {"document_root": settings.MEDIA_ROOT}),

头像更新

   在用户创建时,关于头像我们是这样做的(关于文件对象不需要再手动读,再去写,直接指定就好,内部会全部帮你做好)。

   如果上传的是一个图片对象,会自动拿它的name属性,添加到media/avatar文件夹下。

if file_obj:
	clean_data["avatar"] = file_obj
	# 注意!用的auth组件,所以用create_user
models.UserInfo.objects.create_user(**clean_data)

   但是如果是设置头像,则不能直接用update,应该用下面的方式。

if request.method == "POST":
    file_obj = request.FILES.get("avatar")
    # 这样才可以自动添加 /avatar 的前缀
    user_obj = request.user
    user_obj.avatar = file_obj
    user_obj.save()
    
    # models.Userinfo.objects.filter(user=request.user).update(avatar=file_obj)
    # 出现错误,会直接将文件名丢进去,并且不会添加/avatar的前缀。所以不要用这种方式
posted @ 2020-09-22 18:50  云崖先生  阅读(251)  评论(0编辑  收藏  举报