Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
上一篇提到在 Django 中 配置 UEditor 富文本编辑器。Django 也有第三方集成的 DjangoUeditor 富文本编辑器,编辑器的功能相似,在配置上会稍微不同。DjangoUeditor 可以用于 admin 的后端富文本编辑器。
需要清楚的一点是,UEditor 配置的文件上传的本地服务器存储路径。
① 下载文件
from django.http import FileResponse
在实际的项目中很多时候需要用到下载功能,如导入 excel、pdf 或者文件下载,当然也可以使用 web 服务自己搭建可以用于下载的资源服务器,如 nginx 。FileResponse 内部使用迭代器进行数据流传输。
def send_file(request,filename):
fp = open(os.path.join(UEDITOR_UPLOAD_PATH,filename),'rb')
response = FileResponse(fp)
response['Content-Type'] = "application/octet-stream"
return response
if hasattr(settings, "UEDITOR_UPLOAD_PATH"):
urlpatterns += [
path("f/<filename>", views.send_file, name='send_file')
]
② 文件上传
@method_decorator([csrf_exempt,require_http_methods(['GET','POST'])],name='dispatch')
class UploadView(View):
def __init__(self):
super(UploadView, self).__init__()
def _random_filename(self,rawfilename):
"""
随机的文件名,保证文件名称不会冲突
"""
letters = string.ascii_letters
random_filename = str(time.time()) + "".join(random.sample(letters, 5))
filename = hashlib.md5(random_filename.encode('utf-8')).hexdigest()
subffix = os.path.splitext(rawfilename)[-1]
return filename + subffix
def _json_result(self,state='', url='', title='', original=''):
"""
返回指定格式的json数据的
"""
result = {
'state': state,
'url': url,
'title': title,
'original': original
}
return JsonResponse(result)
def _upload_to_server(self,upfile,filename):
"""
上传文件到自己的服务器
"""
with open(os.path.join(UEDITOR_UPLOAD_PATH, filename), 'wb') as fp:
for chunk in upfile.chunks():
fp.write(chunk)
url = reverse("ueditor:send_file", kwargs={"filename": filename})
return 'SUCCESS', url, filename, filename
def _action_config(self):
"""
处理config类型的响应
"""
config_path = UEDITOR_CONFIG_PATH
with open(config_path, 'r', encoding='utf-8') as fp:
result = json.loads(re.sub(r'\/\*.*\*\/', '', fp.read()))
return JsonResponse(result)
def _action_upload(self,request):
"""
处理文件(图片,视频,普通文件)上传
"""
upfile = request.FILES.get("upfile")
filename = self._random_filename(upfile.name)
qiniu_result = None
server_result = None
if UEDITOR_UPLOAD_TO_QINIU:
qiniu_result = self._upload_to_qiniu(upfile,filename)
if UEDITOR_UPLOAD_TO_SERVER:
server_result = self._upload_to_server(upfile,filename)
if qiniu_result and qiniu_result[0] == 'SUCCESS':
return self._json_result(*qiniu_result)
elif server_result and server_result[0] == 'SUCCESS':
return self._json_result(*server_result)
else:
return self._json_result()
def _action_scrawl(self,request):
base64data = request.form.get("upfile")
img = base64.b64decode(base64data)
filename = self._random_filename('xx.png')
with open(os.path.join(UEDITOR_UPLOAD_PATH, filename), 'wb') as fp:
fp.write(img)
url = reverse('ueditor:send_file', kwargs={"filename": filename})
return self._json_result('SUCCESS', url, filename, filename)
def dispatch(self, request, *args, **kwargs):
super(UploadView, self).dispatch(request,*args,**kwargs)
action = request.GET.get('action')
if action == 'config':
return self._action_config()
elif action in ['uploadimage','uploadvideo','uploadfile']:
return self._action_upload(request)
elif action == 'uploadscrawl':
return self._action_scrawl(request)
else:
return self._json_result()