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