05-Django高级扩展 - 图1

上传图片

代码示例

upload.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form method="post" action="/savefile/" enctype="multipart/form-data">
  9. {% csrf_token %}
  10. <input type="file" name="file">
  11. <input type="submit" value="上传">
  12. </form>
  13. </body>
  14. </html>

myApp/urls.py

  1. re_path(r'^upload/$', views.upload),
  2. re_path(r'^savefile/$', views.savefile),

myApp/views.py

  1. def upload(request):
  2. return render(request, 'myApp/upload.html')
  3. from django.conf import settings
  4. def savefile(request):
  5. if request.method == 'POST':
  6. f = request.FILES['file']
  7. print(f)
  8. filePath = os.path.join(settings.MEDIA_ROOT, f.name)
  9. with open(filePath, 'wb') as fp:
  10. for info in f.chunks():
  11. fp.write(info)
  12. return HttpResponse('上传成功')
  13. else:
  14. return HttpResponse("上传失败")

分页

分页代码

myApp/views.py

  1. def studentpage(request):
  2. page = request.GET.get('current', 1)
  3. pageSize = request.GET.get('pageSize', 10)
  4. allList = Students.objects.all()
  5. paginator = Paginator(allList, pageSize)
  6. currentPageList = paginator.page(page)
  7. return render(request, 'myApp/studentpage.html', {"students": currentPageList})

celery

http://docs.jinkan.org/docs/celery/

问题

  • 用户发起request,并且要等待response返回,但是在视图中又一些耗时的操作,导致用户可能会等待很长时间才能接受response,这样用户体验很差
  • 网站每隔一段时间要同步一次数据,但是http请求是需要触发的

    解决

  • celery解决

    • 将耗时的操作放到celery执行
    • 使用celery定时执行

      celery

  • 任务

    • 本质是一个python函数,将耗时操作封装成一个函数
  • 队列
    • 将要执行的任务放队列里
  • 工人
    • 负责执行队列中的任务
  • 代理

    • 负责调度,在部署环境中使用redis

      安装

  • pip install celery

  • pip install celery-with-redis
  • pip install django-celery

    配置

    settings.py

    ```bash INSTALLED_APPS = [
    1. ...
    ‘djcelery’, ]

celery

import djcelery

djcelery.setup_loader() # 初始化 BROKER_URL = ‘redis://:test@127.0.0.1:6379/0’ CELERY_IMPORTS = (‘myApp.task’)

<a name="LXIRH"></a>
#### 创建project/myApp/task.py
<a name="gdGl5"></a>
#### 迁移,生成celery需要的数据库表
```bash
python manage.py migrate

project/celery.py

from __future__ import absolute_import

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

from django.conf import settings  # noqa

app = Celery('proj')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
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))

在工程目录下的init.py文件中添加

from .celery import app as celery_app