项目介绍-ACMClass_Calendar

发布于 2020-02-26  1.02k 次阅读


基于flask实现简单的日程管理日历。

项目地址:ACMClass_Calendar(为什么改用gitee了?因为github国内访问太慢啦~)

2020年第一学期,在疫情的影响下,不少学校选择了网课教学,我校也是如此。为了在没有相互提醒的情况下实现日程集中管理,防止同学忘记上课。同时也为了填上学期末留下的坑,我和cong258258一同完成了这个项目。

功能展示:

主页:

月份视图:

事件详情(支持html代码注入图片):

后台管理:

支持iCal订阅:

部署方法:

本项目需要python3, flask环境,推荐在Linux服务器上部署(尽管macOS,Windows下都能用就是了)。

下载代码后,首先通过initdb.py初始化数据库,并修改config.py中的管理员密码和管理员登陆超时事件(单位:秒)。

建议通过apache2/nginx+WSGI进行部署,不推荐直接反向代理测试服务器。

实现思路:

(以下是关于本项目代码内容的注解,不需要了解代码细节的读者可以不继续往下读了)

当初决定要开发这个项目时,我向web开发经验丰富的学长询问有什么推荐的开发框架,从中得知了flask框架。加之自己本身有一定的python3基础,于是决定基于flask进行开发。

数据库采用sqlite3,python3原生集成。考虑到这东西几乎不需要什么效率,采用sqlite3也是可取的了。

月份界面的实现,直接利用flask3通过地址栏获取参数;日程详情界面的实现同上。

index的输入和添加、删除日程界面的输入通过request获取post方式下的form。

关于管理员认证界面,用户输入密码通过地址栏明文传送(因为是https所以没问题),管理员密码在后台明文存储(似乎不太安全的样子)。

通过cookie鉴别管理员身份。每当管理员登陆成功时,将获得一个名为status的cookie,其值为'login',用于鉴别是否登陆;和一个名为id的cookie,其值为一个uuid4,用于鉴别当前登陆是否有效。

主程序后台有一个dict,存储下发的id(uuid4)和下发cookie对应的时间。每当请求鉴权时,首先将dict中已经超时的id删掉,再检测当前待鉴别id是否存在于dict中。代码如下:

def checkCookiePool(x):
    updateCookiePool()
    return x in cookiePool
def updateCookiePool():
    cur = str(datetime.now() - timedelta(seconds=COOKIE_LIVE_TIME))
    nw = []
    for key, value in cookiePool.items():
        if value > cur:
            nw.append((key, value))
    cookiePool.clear()
    for key, value in nw:
        cookiePool[key] = value

这样能避免通过伪造cookie获取管理员权限。

关于iCal订阅的实现,手动将项目转化为iCal格式即可。

iCal格式通过纯文本进行交换,具体定义如下:

BEGIN:VCALENDAR # 日历段开始
VERSION:2.0 # 版本说明
PRODID:ACMClass Calendar Beta # 生成器版本
BEGIN:VEVENT # 事件段开始
DTSTART:20200226T133000 # 开始时间,用T分割。结尾无字母表示默认本地时间
DTEND:20200226T140000 # 结束时间,用T分割。结尾无字母表示默认本地时间
SUMMARY:system test # 事件综述
DESCRIPTION:This is a system test. # 事件详情
END:VEVENT # 事件段结尾
END:VCALENDAR # 日历段结尾

再次鸣谢cong258258帮我美化前端界面。再次感谢flask,python等开源项目。

全文终.


Faster than LIGHT