这是Django Channels系列文章的第二篇,以web端实现tailf的案例讲解Channels的具体使用以及跟Celery的结合
通过上一篇 《Django使用Channels实现WebSocket–上篇》 的学习应该对Channels的各种概念有了清晰的认知,可以顺利的将Channels框架集成到自己的Django项目中实现WebSocket了,本篇文章将以一个Channels+Celery实现web端tailf功能的例子更加深入的介绍Channels
先说下我们要实现的目标:所有登录的用户可以查看tailf日志页面,在页面上能够选择日志文件进行监听,多个页面终端同时监听任何日志都互不影响,页面同时提供终止监听的按钮能够终止前端的输出以及后台对日志文件的读取
最终实现的结果见下图
接着我们来看下具体的实现过程
技术实现
所有代码均基于以下软件版本:
- python==3.6.3
- django==2.2
- channels==2.1.7
- celery==4.3.0
celery4在windows下支持不完善,所以请 在linux下运行 测试
日志数据定义
我们只希望用户能够查询固定的几个日志文件,就不是用本文来源[email protected]搞@^&代*@码)网9数据库仅借助settings.py文件里写全局变量来实现数据存储
在settings.py里添加一个叫 TAILF 的变量,类型为字典,key标识文件的编号,value标识文件的路径
TAILF = { 1: '/ops/coffee/error.log', 2: '/ops/coffee/access.log', }
基础Web页面搭建
假设你已经创建好了一个叫tailf的app,并添加到了settings.py的INSTALLED_APPS中,app的目录结构大概如下
tailf - migrations - __init__.py - __init__.py - admin.py - apps.py - models.py - tests.py - views.py
依然先构建一个标准的Django页面,相关代码如下
url:
from django.urls import path from django.contrib.auth.views import LoginView,LogoutView from tailf.views import tailf urlpatterns = [ path('tailf', tailf, name='tailf-url'), path('login', LoginView.as_view(template_name='login.html'), name='login-url'), path('logout', LogoutView.as_view(template_name='login.html'), name='logout-url'), ]
因为我们规定只有通过登录的用户才能查看日志,所以引入Django自带的LoginView,logoutView帮助我们快速构建Login,Logout功能
指定了登录模板使用 login.html ,它就是一个标准的登录页面,post传入username和password两个参数即可,不贴代码了
view:
from django.conf import settings from django.shortcuts import render from django.contrib.auth.decorators import login_required # Create your views here. @login_required(login_url='/login') def tailf(request): logDict = settings.TAILF return render(request, 'tailf/index.html', {"logDict": logDict})
引入了 login_required
装饰器,来判断用户是否登录,未登录就给跳到 /login 登录页面