资讯专栏INFORMATION COLUMN

7-django——文件上传_分页_ajax_富文本_celery

lylwyy2016 / 881人阅读

摘要:上传文件概述当在处理文件上传时,文件的数据被存储在属性中只有在请求的方法为且提交的表单带有属性的情况才会包含数据。如豆瓣,防止页面卡死。

上传文件 概述

当Django在处理文件上传时,文件的数据被存储在request.FILES属性中

FILES只有在请求的方法为POST且提交的form表单带有enctype="multipart/form-data"属性的情况才会包含数据。否则,FILES将为一个空的类似字典的对象

FILES中的键为input的name属性值

上传界面



    
    文件上传


    
{% csrf_token %}
文件存储路径

在static目录下创建名为media的目录

配置路径:

settings

# 文件上传的路径
MEDIA_URL = "/media/"   # 访问资源的地址如 http://127.0.0.1:5000/media/1.jpg
# 写相对路径也可以
MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")
request.FILES数据结构
{
    "file": [
        , 
        
    ], 
    "pic": [
        
    ]
}
视图实现
from django.conf import settings
def upfile(request):
    if request.method == "GET":
        return render(request, "upfile.html")
    else:
        # print(request.FILES)
        for name in request.FILES:
            files = request.FILES.getlist(name)
            # print(files)
            for file in files:
                #处理每个文件
                filePath = r"%s\%s"%(settings.MEDIA_ROOT,file.name)
                with open(filePath, "wb") as fp:
                    # 将文件数据切片写入描述符
                    for part in file.chunks():
                        fp.write(part)
        return HttpResponse("上传文件成功")
图片生成缩略图
# 生成缩略图

from PIL import Image
im = Image.open("c.jpg")
print(im.format, im.size, im.mode)
# JPEG (840, 1024) RGB
im.thumbnail((100,200))
im.save("c1.jpg", "JPEG")
分页 Paginator对象

Page对象

示例
from django.core.paginator import Paginator
def students(request, num):
    allStudents = Student.objects.all()
    #分页 每页6条数据
    paginator = Paginator(allStudents, 6)
    print(paginator.count, paginator.num_pages, paginator.page_range)
    pageStus = paginator.page(num)
    return render(request, "students.html", {"stus":pageStus})



    
    学生信息


学生信息

    {% for stu in stus %}
  • {{ stu.name }}--{{ stu.grade }}--{{ stu.age }}
  • {% endfor %}
{% if stus.has_previous %} 上一页 {% endif %} {% for index in stus.paginator.page_range %} {% if index == stus.number %} {{ index }} {% else %} {{ index }} {% endif %} {% endfor %} {% if stus.has_next %} 下一页 {% endif %}
Ajax 问题

使用视图通过上下文向模板中传递数据,需要先加载完成模板的静态页面,再执行模板模型代码,生成最后的HTML代码,返回给浏览器,这个过程将页面与数据集成到了一起,扩展性差

解决

通过ajax的方式获取数据,再通过DOM操作将数据呈现到界面上

异步:如发邮件(注册的时候提示邮件已经发送成功,其实并没有) 能提高用户体验。 如豆瓣,防止页面卡死。

前端代码



    
    展示学生
    


    
    
def allStudents(request):
    if request.method == "GET":
        if not request.is_ajax():
            return render(request, "allStudents.html")
        else:
            stus = Student.objects.all()
            arr = []
            for stu in stus:
                arr.append({"name":stu.name, "age":stu.age})
            return JsonResponse({"data":arr})
富文本

安装:pip install django-tinymce

在站点中使用 激活应用
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "myApp",
    "tinymce",
]
配置
TINYMCE_DEFAULT_CONFIG={
    "theme":"advanced",
    "width":600,
    "height":400
}
模型
from tinymce.models import HTMLField
class Article(models.Model):
    title = models.CharField(max_length=20)
    content = HTMLField()
admin.py
admin.site.register(Article)
在自定义页面中使用



    
    书写博客
    
    



    
{% csrf_token %}

Celery 问题

用户发起request请求,并等待response返回。在本次views中,可能需要执行一段耗时的程序,那么用户会等待很长时间,造成不好的用户体验

网站每小时需要同步数据(天气预报信息),但是http是需要触发的,难道要一个小时请求一次吗?

解决方案

使用celery:将耗时的程序放到celery中执行 使用celery定时执行

celery

任务task:就是一个python函数

队列queue:将需要执行的任务加入队列中

工人worker:在一个新的进程中负责执行队列中的任务

代理broker:负责调度,在布置环境中使用redis

安装
pip  install  celery==3.1.25
pip  install  celery-with-redis==3.0
pip  install  django-celery==3.2.1
配置 激活应用
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "myApp",
    "tinymce",
    "djcelery",
]
配置redis
#celery
import djcelery
djcelery.setup_loader()
#配置redis数据库
#redis://:密码@ip:端口/库
BROKER_URL="redis://:sunck@127.0.0.1:6379/0"
#配置任务文件
CELERY_IMPORTS=("myApp.task")
创建任务文件,并分装任务
# 在应用目录下创建名为task.py的文件
# -*- coding:utf-8 -*-
from celery import task
import time

@task
def longIO():
    print("开始耗时操作……")
    time.sleep(5)
    print("结束耗时操作……")
迁移

python manage.py migrate

生成celery所需要的表

添加celery.py文件

将已存在的celery.py添加到工程目录下的与工程目录同名的目录下

celery.py

from __future__ import absolute_import

import os
from celery import Celery
from django.conf import settings

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "whthas_home.settings")

app = Celery("portal")

app.config_from_object("django.conf:settings")
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print("Request: {0!r}".format(self.request))
导入celery

在工程目录下的与工程目录同名的目录中的__init__.py文件中添加from .celery import app as celery_app

在视图使用任务
from myApp.task import longIO
def registe(request):
    longIO.delay()
    return HttpResponse("sunck is a good man")
启动redis
redis-server.exe     redis.windows.conf
启动worker
python  manage.py  celery  worker  --loglevel=info
启动Django服务
python  manage.py  runserver

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42011.html

相关文章

  • 6-django——admin站点管理

    摘要:概述负责添加修改删除内容,开发这些重复的功能是一件没有创造力的事情。然后进入该目录执行安装配置主路由模块自动注册需要版本控制的如果出现是由于数据库中没有的表的问题,可以删除数据库,执行迁移。。文件上传分页富文本 概述 负责添加、修改、删除内容,开发这些重复的功能是一件没有创造力的事情。因此Django会根据定义的模型自动生成管理模块 配置Admin应用 在settings.py文件中的...

    Leck1e 评论0 收藏0
  • django项目admin后台整合tinymce文本编辑并自定义添加图片本地上传文本中的回显

    摘要:选择该页面绑定的标签指定图片上传处理目录注其中为了显示为中文,标明了中文,同时需要下载语言包放到对应的文件夹下。 前言 我们常因为django的自带admin后台功能而选择该框架,但也因为其自动生成的特殊性而在做出特别的更改的时候束手束脚,鉴于项目已经采用了django,而后台要求能够直接上传富文本内容直接用于网页显示,定制性高,后来翻了目前较为知名的几款富文本编辑框,觉得还是tiny...

    HackerShell 评论0 收藏0
  • django项目admin后台整合tinymce文本编辑并自定义添加图片本地上传文本中的回显

    摘要:选择该页面绑定的标签指定图片上传处理目录注其中为了显示为中文,标明了中文,同时需要下载语言包放到对应的文件夹下。 前言 我们常因为django的自带admin后台功能而选择该框架,但也因为其自动生成的特殊性而在做出特别的更改的时候束手束脚,鉴于项目已经采用了django,而后台要求能够直接上传富文本内容直接用于网页显示,定制性高,后来翻了目前较为知名的几款富文本编辑框,觉得还是tiny...

    Honwhy 评论0 收藏0
  • django项目admin后台整合tinymce文本编辑并自定义添加图片本地上传文本中的回显

    摘要:选择该页面绑定的标签指定图片上传处理目录注其中为了显示为中文,标明了中文,同时需要下载语言包放到对应的文件夹下。 前言 我们常因为django的自带admin后台功能而选择该框架,但也因为其自动生成的特殊性而在做出特别的更改的时候束手束脚,鉴于项目已经采用了django,而后台要求能够直接上传富文本内容直接用于网页显示,定制性高,后来翻了目前较为知名的几款富文本编辑框,觉得还是tiny...

    k00baa 评论0 收藏0
  • summernote(文本编辑器)将附件与图片上传到自己的服务器(vue项目)

    摘要:将创建好的对象,再插入到编辑器中注意这里不用方法因为他会额外的标签具体查看,另外当选取本地文件的时候,此时的富文本编辑器会失去焦点,插入新的节点的时候,总是从起始点开始插入,而非从当前光标的位置进行插入。 1.上传图片至自己的服务器(这个官方都有例子,重点介绍附件上传)图片上传官方网址 // onChange callback $(#summernote).summernote({ ...

    wqj97 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<