一、介绍
用户上传的文件以及项目中使用的静态文件,除了保存在本地服务器,还在可以保存在云服务中,比如:
- 阿里云
- 七牛云(课程选用)
- 亚马逊云
- 等
1.1、使用方式
-
注册账号 七牛云开发者平台
-
实名认证
-
创建空间
二、封装七牛云工具类
官网:Python SDK_SDK 下载_对象存储 - 七牛开发者中心
官网有提供使用七牛云的代码案例,具体方法如下:
2.1、封装代码
# -*- coding: utf-8 -*-
# pip install qiniu-7.9.0
from qiniu import Auth, put_data
def upload_file(ak,sk,file_data):
'''
ak: access_key
sk: secret_key
file_data: 上传的文件数据流
'''
#构建鉴权对象
q = Auth(ak, sk)
#要上传的空间
bucket_name = 'djangofile1'
#上传后保存的文件名
# key如果指定,按照指定的名称存储,
# key如果为空则以文件的hash值作为文件名
# key = 'my-python-logo.png'
key = None
#生成上传 Token,可以指定过期时间等
token = q.upload_token(bucket_name, key, 3600)
#要上传文件的本地路径
# localfile = './sync/bbb.jpg'
# ret, info = put_file(token, key, localfile, version='v2')
ret,info = put_data(token,key,file_data)
# print(f'{ret=}')
# print(f'{info=}')
if ret:
print('上传成功')
return ret.get('key')
if __name__ == '__main__':
# 上传文件
# 打开文件
with open('qiniu_cloud5/a1.jpg','rb') as f:
file_data = f.read()
#需要填写你的 Access Key 和 Secret Key
access_key = 'do0Ws6Yrq4H3feH1m0ukabj3XdwMkBE-dNwR8ZO0'
secret_key = '2ZjprfTmDpQ3DVP4O7sEX0MBXs03Eh-bXhTPDf9L'
# 开始上传
filename = upload_file(access_key,secret_key,file_data)
print(f'上传文件的名字是:{filename}')
三、Django使用云存储
-
建立项目
django-admin startproject project_demo
-
创建子应用
python manage.py startapp app_name
-
修改配置文件,设置模板视图路径
settings.py
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR,'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
-
建立逻辑视图
from django.shortcuts import render from .models import Upload # Create your views here. def upload_file(request): if request.method == 'GET': return render(request,'upload.html') # 上传文件 elif request.method == 'POST': # 获取上传的文件,如果没有文件,则默认为None file = request.FILES.get('file') return render(request,'show.html',{'upload':upload}) def get_file(request,pk): # 获取文件 upload = Upload.objects.get(pk=pk) return render(request,'show.html',{'upload':upload})
-
建立路由地址
from django.urls import path from . import views urlpatterns = [ path('upload_file/', views.upload_file, name='upload_file'), path('get_file/<int:pk>/', views.get_file, name='get_file'), ]
-
建立模板页面
upload.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h2>这个测试</h2> <form action="/upload_file/" method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="img"><br> <input type="text" name="desc"><br> <input type="submit" value="上传"> </form> </body> </html>
-
show.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <ul> <li>图片名:{{img.name}}</li> <li>图片地址:{{img.url}}</li> <li><img src="{{img.url}}" alt=""></li> </ul> </body> </html>