python简易博客(六)–mvc+构造前端+pymonitor.py

1.MVC:

模型-视图-控制器(MVC)是Xerox PARC在二十世纪八十年代为编程语言Smalltalk-80发明的一种软件设计模式
模型:   数据,Model用纯JavaScript对象表示
视图:    前端页面(html)   View是纯HTML
控制器:   把Model和View关联起来的就是ViewModel。
def index(request):….return {‘__template__’:’test.html’,’user’:user}

2.构造前端

include             分header  body  footer  3个分段文件
base文件   改成子文件
{%extends ‘__base__.html ‘ %}继承父模板     {% %}复用模板

3.pymonitor.py

diango 的开发环境在debug模式下调试
pyinotify依赖于Linux平台的inotify ,watchdog模块是跨平台
whatdog:监控文件系统事件的Python库和shell工具
1.observer,event_handler,被监控的文件夹。三者原本是独立的,主要通过observer.schedule函数将三者串起来,意思为observer不断检测调用平台依赖代码对监控文件夹进行变动检测,当发现改变时,通知event_handler处理。(有待观察)
使用LoggingEventHandler()事件处理器,当指定目录发生任何变化都会打印消息到终端。https://blog.csdn.net/symayy/article/details/77943680
2.事件类(event):事件类基类,所有具体事件类的父类。当一个目录或文件变化时,就会产生一个特定事件,也就是该类的子类。
编写pymonitor 让它启动wsgiapp.py 若是代码有改动,先kill掉,再重启
利用Python自带的subprocess实现进程的启动和终止,并把输入输出重定向到当前进程的输入输出中

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'Michael Liao'
import os, sys, time, subprocess
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
def log(s):
    print('[Monitor] %s' % s)
class MyFileSystemEventHander(FileSystemEventHandler):
    def __init__(self, fn):
        super(MyFileSystemEventHander, self).__init__()
        self.restart = fn
    def on_any_event(self, event):
        if event.src_path.endswith('.py'):
            log('Python source file changed: %s' % event.src_path)
            self.restart()
command = ['echo', 'ok']
process = None
def kill_process():
    global process
    if process:
        log('Kill process [%s]...' % process.pid)
        process.kill()
        process.wait()
        log('Process ended with code %s.' % process.returncode)
        process = None
def start_process():
    global process, command
    log('Start process %s...' % ' '.join(command))
    process = subprocess.Popen(command, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr)
def restart_process():
    kill_process()
    start_process()
def start_watch(path, callback):
    observer = Observer()
    observer.schedule(MyFileSystemEventHander(restart_process), path, recursive=True)
    observer.start()
    log('Watching directory %s...' % path)
    start_process()
    try:
        while True:
            time.sleep(0.5)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
if __name__ == '__main__':
    argv = sys.argv[1:]
    if not argv:
        print('Usage: ./pymonitor your-script.py')
        exit(0)
    if argv[0] != 'python3':
        argv.insert(0, 'python3')
    command = argv
    path = os.path.abspath('.')
    start_watch(path, None)

 

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注