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的前缀。所以不要用这种方式