django社交类程序笔记(12)静态文件处理及七牛云

Nginx
可以对应多台服务器,分布式多台环境,
分布式环境后,单台服务器保存的东西不一样,内存数量有限,数据一般会存在服务器上,
Nginx本身可以代理静态资源的,并且还很快,一般是服务器写好的静态文件,但是用户上传的东西太多了,上传图片,文件,视频,如果使用Nginx,就需要多台同步,
CDN
内容分发网络,为了全国各地部署很多节点,例如:网站在北京叫源站,中部武汉,深圳,西安,成都,沈阳,旧金山,cdn会定期到源站同步资源,其他叫镜像站,接口走源站,静态资源走CDN。
阿里云是最大的CDN,蓝汛以前就是最大的cdn。视频直播都是走的蓝汛这里来的。
按带宽
云存储:
亚马逊S3服务,阿里云OSS,七牛云等。又拍云也有很多存储。
本节主要讲七牛云:
程序处理流程:

  1. 用户图片上传到服务器,
  2. 服务器将图片上传到七牛云,
  3. 将七牛云返回的图片url存入数据库,
    点开七牛云开发者平台:
    新建存储空间,免费有10个G。域名提供一个月的试用,
    跟七牛云对接,文档。sdk文档python。
    一般国外的quickstart,直接查看。
pip install qiniu

https://developer.qiniu.com/sdk#official-sdk
需要查看access_key,secret_key,个人中心查看AK,SK。

from qiniu import Auth
q = Auth(access_key, secret_key)

我们在主项目的config.py中配置七牛基础信息下:

"""七牛云配置"""
QN_ACCESS_KEY = 'xxxxx'
QN_SECRET_KEY = 'xxxxx'
QN_BUCKET_KEY = 'swiper'
QN_BASE_URL = '七牛云cdn域名' 要加个http://

在lib里面写个qncloud.py,这里将本地上传七牛的函数:

from qiniu import Auth, put_file

# 构建鉴权对象
from spiter.config import QN_ACCESS_KEY, QN_SECRET_KEY, QN_BUCKET_NAME

q = Auth(QN_ACCESS_KEY, QN_SECRET_KEY)


def upload_to_qiniu(localfile, key):
    """
    将本地文件上传到七牛云
    Args:
        bucket_name:要上传的空间
        key:上传后保存的文件名
        token:生成上传 Token,可以指定过期时间等
        localfile:要上传文件的本地路径
    """
    bucket_name = QN_BUCKET_NAME
    #key = 'my-python-logo.png'
    token = q.upload_token(bucket_name, key, 3600)
    localfile = localfile
    ret, info = put_file(token, key, localfile)
    print(info)

    return ret, info

可以使用python manage.py shell

from lib.qncloud import upload_to_qiniu
resp = upload_to_qiniu('manage.py', 'abc.py')

打开七牛云存储可以查看上传了一个manage.py文件上去。
在这里插入图片描述
修改头像处理
form.py文件中加入:

class UploadForm(forms.Form):
    avatar = forms.ImageField()

考虑修改步骤:
1.接收用户上传的头像,
2.定义用户头像名称
3.异步将头像上传七牛,
4.将url保存入数据库
需要考虑用户头像名称不能重复,用户头像大,会卡,需要用celery异步,
qncloud.py文件中加入我们之前写好的worker文件中celery配置:

"""保留上面函数,手动装饰一下这个函数,既有同步的,也有异步的"""
async_upload_to_qiniu = call_by_worker(upload_to_qiniu())
用户上传的内容都存在request.FILES里

api.py中加入,头像上传
1.接收用户上传的头像,
2.定义用户头像名称
3.异步将头像上传七牛,
4.将url保存入数据库
需要考虑用户头像名称不能重复,用户头像大,会卡,需要用celery异步,
用户上传的内容都存在request.FILES里

def upload_avatar(request):
    """头像上传"""
    file = request.FILES.get('avatar')
    if file:  # 内存中的文件
        save_upload_file(request.user.file, upload_file=file)
        return render_json(None)
    else:
        return render_json(None, error.FILE_NOT_FOUND)

logic.py中加入下面代码,包含文件名的命名,存储文件路径设置,然后将上传到七牛云后图片的路径url保存在数据库中:

"""保存上传文件,并上传到七牛云"""
def save_upload_file(user, upload_file):
    # 获取文件,并保存在本地
    ext_name = os.path.splitext(upload_file.name)[-1]
    filename = 'Avatar-%s%s' % (user.uid, ext_name)
    filepath = os.path.join(settings.BASE_DIR, settings.MEDIA_ROOT, filename)
    with open(filepath, 'wb') as newfile:
        for chunk in upload_file.chunks():
            newfile.write(chunk)
    # 异步将头像上传七牛
    async_upload_to_qiniu(filepath, filename)  # 可以省一个函数

    """上传完以后还有一个过程,url保存在数据库里"""

    url = urljoin(config.QN_BASE_URL, filename)
    user.avatar = url
    user.save()
发布了89 篇原创文章 · 获赞 7 · 访问量 2196

猜你喜欢

转载自blog.csdn.net/qq_36710311/article/details/105188336