面试官问我Python日历模块,我直接用Flask开发Web版日历应用给他

Python自动化生成逼格高的日历!简单又实用 本次内容有感于《Python编程快速上手-让繁琐工作自动化》。 根据书中的「处理Excel电子表格」章节内容,做出一份专属日历。 使用的模块为openpyxl,一个能读取和修改Excel电子表格的Pyhton模块。 实现自动化处理表格信息,摆脱无趣无味。 此外还有calendar模块,通过该模块生成日历信息。 最后利用openpyxl和calendar库,实现自动化生成爱豆日历。 / 01 / 科... 阅读详情

  嚣张的面试开场  

面试官:小伙子,python与时间有关的基础模块有哪些?
我:time datetime calendar
面试官:简单介绍下calendar日历模块
我:我拒绝!
面试官:小子你很拽啊,那你想如何?
我:我想给大佬你做一个美观的网页版日历啊。
面试官:走两步,我瞧瞧…
我:好嘞!

 Python Calender模块 

python的日历模块Calender提供了多种日历展示模式:

参数说明示例
calendar.calendar(year)输出某一年的日历calendar.calendar(2019)
monthcalendar(year, month)返回一个月中天数列表(不是当前月份的天数为0)calendar.monthcalendar(2019, 6)
setfirstweekday(firstweekday)0是星期一,…,6为星期日calendar.setfirstweekday(firstweekday=6)
prmonth(theyear, themonth, w=0, l=0)w每个单元格宽度,l每列换l行calendar.prmonth(2019, 6)
calendar.month_abbr[month]打印月份对应的英文简写calendar.month_abbr[6]
calendar.isleap(year)判断某一年是否为闰年calendar.isleap(2012)
calendar.weekday(year,month,day)判断某一天是周几0(周一一)到6(周日)calendar.weekday(2019,12,25)
………

基本的就是上面这些了….

  Bootstrap 表格  

Flask使用Bootstrap模板,这个前几期已经说了,还不清楚的朋友,可以看看往期内容。
今天主要说下Bootstrap的table

类说明
.table少量的内补(padding)和水平方向的分隔线
.table-striped给 <tbody> 之内的每一行增加斑马条纹样式
.table-bordered为表格和其中的每个单元格增加边框
.table-hover可以让 <tbody> 中的每一行对鼠标悬停状态作出响应
.table-condensed可以让表格更加紧凑,单元格中的内补(padding)均会减半
.active鼠标悬停在行或单元格上时所设置的颜色
.success标识成功或积极的动作
.info标识普通的提示信息或动作
.warning标识警告或需要用户注意
.danger标识危险或潜在的带来负面影响的动作

 

   Flask日历   

今天通过Flask,制作一个网页版日历,系统启动后,计算当天日期,并生成日历,高亮表示本月和今日。
首先,需要考虑日历的响应式布局,每行放四个月的数据,所以需要使用Bootstrap的栅格化<div class="col-lg-3">,保证在没有足够宽的情况下,自动转为单月的数据展示,避免重叠
其次,针对数据的排列,日历模块中calendar.monthcalendar(year, month)会返回一个原组,但如同下面的情况:

 1>>> import calendar
 2>>> calendar.setfirstweekday(firstweekday=6)
 3>>> calendar.monthcalendar(2019,5)
 4>>> [[0, 0, 0, 1, 2, 3, 4], [5, 6, 7, 8, 9, 10, 11],
 5     [12, 13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24, 25],
 6     [26, 27, 28, 29, 30, 31, 0]]
 7>>> calendar.monthcalendar(2019,6)
 8>>> [[0, 0, 0, 0, 0, 0, 1], [2, 3, 4, 5, 6, 7, 8],
 9     [9, 10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22],
10     [23, 24, 25, 26, 27, 28, 29], [30, 0, 0, 0, 0, 0, 0]]
11>>> len(calendar.monthcalendar(2019,5))
12>>> 5
13>>> len(calendar.monthcalendar(2019,6))
14>>> 6

有的月份刚好卡在1号周六,所以列表长为6….这样会导致绘图的时候日历表格高度差异,所以如果不满6个的月份,我们手动给他创建创建一个数据全为0的空列表:

 1def calc_calender(date):
 2    year = date.year
 3    yearInfo = dict()
 4    for month in range(1, 13):
 5        days = calendar.monthcalendar(year, month)
 6        if len(days) != 6:
 7            days.append([0 for _ in range(7)])
 8        month_addr = calendar.month_abbr[month]
 9        yearInfo[month_addr] = days
10    return yearInfo

针对返回的数据,使用Jinjia2模板进行循环获取,要注意一点是,如果是日期是0的,代表站位符,需要进行替换。
但如果整行都是零,会导致Bootstrap的表单样式变更,故使用&nbsp进行占位操作。
最终HTML代码如下:

 1<!DOCTYPE html>
 2<html lang="en">
 3
 4<head>
 5    <meta charset="utf-8">
 6    <meta http-equiv="X-UA-Compatible" content="IE=edge">
 7    <meta name="viewport" content="width=device-width, initial-scale=1">
 8    <title>Flask Calendar</title>
 9    <link rel="icon" href="{{ url_for('static',filename='favicon.ico') }}">
10    <link href="{{ url_for('static',filename='bootstrap.min.css') }}" rel="stylesheet">
11</head>
12
13<body>
14<div class="container">
15    <h3 class="text-center">Welcome to Flask Calendar {{date.year}} <small><a href="https://www.jianshu.com/u/d23fd5012bed"> 清风Python</a></small></h3>
16
17    {% set week_addr = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] %}
18    {% for month_addr,monthInfo in content.items()%}
19
20    <div class="col-lg-3">
21        <h4 class="text-center">{{month_addr}}</h4>
22        {% with _month=false %}
23        {% if month_addr == this_month %}
24            <table style='background-color:#a6e1ec' class="table table-bordered">
25            {% set _month = true %}
26        {% else %}
27            <table class="table table-bordered">
28        {% endif %}
29                <tr>
30                    {% for addr in week_addr %}
31                        <th>{{addr}}</th>
32                    {% endfor %}
33                </tr>
34                {% for weeks in monthInfo %}
35                <tr>
36                    {% for day in weeks %}
37                    {% if day == 0 %}
38                    <td>&nbsp</td>
39                    {% elif _month== true and day == date.day %}
40                    <td style="background-color:hotpink;">{{ day }}</td>
41                    {% else %}
42                    <td>{{ day }}</td>
43                    {% endif %}
44                    {% endfor %}
45                </tr>
46                {% endfor %}
47                {% endwith %}
48            </table>
49    </div>
50    {% endfor %}
51
52</div>
53
54</body>
55<footer class="text-center "><strong><a href="https://www.jianshu.com/u/d23fd5012bed">Flask Calendar By:清风Python</a></strong></footer>
56</html>

JInjia2模板中,通过对with 和set的局部变量定义,判断月份与日期,最终达到高亮当月和当天的效果:

当天高亮效果

再来看看完整的效果展示:


完整效果

完整代码:

代码目录
 1# -*- coding: utf-8 -*-
 2# @Author   : 王翔
 3# @JianShu  : 清风Python
 4# @Date     : 2019/6/4 06:01
 5# @Software : PyCharm
 6# @version  :Python 3.6.8
 7# @File     : index.py
 8
 9from flask import Flask, render_template, request, session, redirect, url_for
10import calendar
11from datetime import datetime
12
13calendar.setfirstweekday(firstweekday=6)
14app = Flask(__name__)
15
16week = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
17
18
19def calc_calender(date):
20    year = date.year
21    yearInfo = dict()
22    for month in range(1, 13):
23        days = calendar.monthcalendar(year, month)
24        if len(days) != 6:
25            days.append([0 for _ in range(7)])
26        month_addr = calendar.month_abbr[month]
27        yearInfo[month_addr] = days
28    return yearInfo
29
30
31@app.route('/', methods=["GET", "POST"])
32def index():
33    if request.method == "GET":
34        date = datetime.today()
35        this_month = calendar.month_abbr[date.month]
36        return render_template('index.html', this_month=this_month, date=date, content=calc_calender(date))
37
38
39if __name__ == '__main__':
40    app.run(debug=True)

公众号回复 日历 ,即可获取完整代码打包文件。

end

热门原创往期:

80行代码!用Python做一个哆来A梦分身

用Python一键生成炫酷九宫格图片,火了朋友圈

熬了一夜!我用Python做了一个网站,帮小姐姐生成漫画头像

用Python实现Instagram滤镜,变成百变女神!

有点玄乎!用Python分析《隐秘的角落》里微表情

每个程序员都是从菜鸟开始成长起来的,没有人一开始就是程序员高手。菜鸟爱编程,专注于分享趣味的编程技巧,不限于Java, Python ,Go, Javascript等语言,让菜鸟爱上编程,进阶成为高手。

菜鸟编程大本营

长按2秒,输入:【书单】

python:实现日历 (附完整源码) 阅读详情

相关推荐

【JQuery】【Python】【Flask】如何快速在Python中生成日期选择器(DatePicker)

用Python+Flask的方式写后端很爽,但是前端仍然涉及JQuery,Bootstrap,JS等等。一般虽然都用Bootstrap,但是遇到一些动作较多的组件,比如DatePicker时就会显得麻烦。有没有更方便的方法实现后端可用的UI呢?当然有!来试试JQuery UI吧。...

每日出拳老爷子的博客 866

calendar模块

#calendar模块 import calendarprint(calendar.calendar(2019,w = 1,c = 1))'''2019 January February March Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We T...

160

python使用Flask框架创建一个简单的动态日历

使用Flask框架创建一个简单的动态日历,运行代码,然后在浏览器中访问,将看到一个动态日历,能够通过点击按钮切换月份。

KEEP CODING 1279

Flask框架(一)--搭建,请求,静态文件,模板(日历制作)

Flask 轻量级框架:flask,web.py,tornado,开发灵活,开发效率低,可以真正体现程序员的水平。 重量级框架:django,方便程序员开发,提供大量的功能组件(站点管理,csrf_token,富文本,表单类,缓存,日志,ORM) flask提供了什么? 只能够完成最简单的请求响应 jinja2:模板系统 werkzeug:工具箱(wsgi) 插件 一、开始Flask f...

一个非常正经的人的博客 537

flask-calendar:Python和Flask简单的Web日历

烧瓶日历 介绍 2017年12月,我决定我想尽可能退出Google服务。 日历是与我联系最紧密的服务之一。 没有太多选择,甚至更少的基于Web的。 我决定尝试使用带有到期日期和一些标签的Trello板一段时间,但事实证明维护起来比较困难。 加上缺少一个月的日历视图,并且不支持重复性/重复性任务,我决定充分利用假期来花费一些时间并构建一个简单的GCalendar克隆。 细节 主日历视图: 创建新的任务视图: 支持在一天中的桌面(如Google日历)上进行基本的拖放操作,现有任务的版本,创建重复性任务(每天,每月,按工作日,按月或特定日期编号),自定义颜色以及一些选项例如隐藏过去的任务或能够手

flask-holcalendar:一个使用Flask编写的简单的Holiday Calendar Web应用程序

烧瓶-日历 使用编写的一个简单的Holiday Calendar Web应用程序。 该应用程序使用作为后端来获取有关办公室假期日历的信息。 用作构建应用程序的Web框架。 , 和用于前端开发。 演示版 建于 入门 这些说明将为您提供在本地计算机上运行并运行的项目的副本,以进行开发和测试。 先决条件 从创建Google Sheets API密钥。 下载notes.json文件并将其放在一边。 安装 克隆仓库: git clone https://github.com/rat9615/flask-holcalendar.git 更改目录: cd flask-holcalendar 。 在

python多进程_代码详解Python多线程、多进程、协程

一、前言很多时候我们写了一个爬虫,实现了需求后会发现了很多值得改进的地方,其中很重要的一点就是爬取速度。本文就通过代码讲解如何使用多进程、多线程、协程来提升爬取速度。注意:我们不深入介绍理论和原理,一切都在代码中。二、同步首先我们写一个简化的爬虫,对各个功能细分,有意识进行函数式编程。下面代码的目的是访问300次百度页面并返回状态码,其中parse_1函数可以设定循环次数,每次循环将当前...

weixin_39605326的博客 183

Python-djangoschedule日历日程安排应用程序

django-schedule:日历/日程安排应用程序,

使用Flask制作美观的网页日历

Calender python的日历模块Calender提供了多种日历展示模式: 参数 说明 示例 setfirstweekday(firstweekday) 0是星期一,…,6为星期日 calendar.setfirstweekday(firstweekday=6) monthcalendar(year, month) 返回一个月中天数列表(不是当前月份的天数为0) cale...

SlaughterDevil的博客 1395

在Python的Flask框架中使用日期和时间的教程

时间戳的问题 我们的微博应用的一个忽略了很久的问题就是日间和日期的显示。 直到现在,我们在我们的User和Post对象中使用Python它自己的方式来渲染时间对象,但这并不是一个好的解决方案。 考虑下这样的例子。我正在写这篇文章,此时正是12月31号下午3:54。我的时区是PST(或者你们更习惯的:UTC-8)。 在Python解释器中运行,我得到下面输出:   >>> from datetime import datetime >>> now = datetime.now() >>> print now 2012-12-31 15:54:42.915204 >>> now = datet

避坑指南:QCustomPlot鼠标事件冲突解决方案(左键拖动vs右键框选)

本文深入解析QCustomPlot在QT框架下的高级交互实现,重点解决左键拖动与右键框选的冲突问题。通过自定义事件处理和QRubberBand技术,提供了一套完整的无冲突交互方案,帮助开发者优化数据可视化应用的用户体验。

moss5的博客 661

关于flask入门教程-关于日期控件DateTimePicker

DateTimePicker是基于JQuery的时间日期选择插件。只需要2行代码,即可轻松实现网页图形化日期时间选择器。关于datetimepicker的使用,请参考https://www...

不胜人生一场醉 1752

【Python 实战基础】如何绘制热力图来模拟绘制北京景区热度图

Python如何绘制热力图来模拟绘制北京景区热度图 文件读写 基础语法 字符串处理 文件生成 数据构建

菜鸟实战的博客 3403

python做项目日程表_Flask框架搭建一个日程表

前言用Flask框架,SQLalchemy,SQlite 和Vertabelo 搭建一个日程表。这个并不是最终产品,目的是展示python web开发的流程,欢迎不吝赐教!github下载源码项目介绍使用Flask开发一个增删改查(CRUD)应用程序:add/update 更新、添加一个类别delete/mark 标记或删除manage categories. 管理类别三个视图:创...

weixin_39939661的博客 938

Unity抖音小游戏上架实战:从零到一,详解流程与避坑指南

本文详细介绍了Unity抖音小游戏上架的全流程,包括环境准备、SDK集成、开发者账号注册、软著申请、打包提交流程及常见问题解决方案。重点解析了抖音小游戏平台特有的配置细节和避坑技巧,帮助开发者高效完成游戏上架并优化用户体验。

weixin_33704234的博客 261

深入解析mSATA与mini-PCIE接口的硬件设计要点

本文深入解析mSATA与mini-PCIE接口的硬件设计要点,涵盖信号定义、电源设计、高速信号处理及PCB布局布线等关键内容。通过实战案例和调试技巧,帮助工程师规避常见设计陷阱,提升电路设计效率,特别适合工业控制和嵌入式系统开发场景。

weixin_28741413的博客 318

用Flask开发Web版日历应用

Python Calender模块 python的日历模块Calender提供了多种日历展示模式: 参数 说明 示例 calendar.calendar(year) 输出某一年的日历 calendar.calendar(2019) monthcalendar(year, month) 返回一个月中天数列表(不是当前月份的天数为0) calendar...

华为云官方博客 3637

从EXIF到测绘:解码大疆影像元数据的实战应用指南

本文深入解析了大疆无人机影像元数据的实战价值,重点阐述了如何利用EXIF和XMP中的GPS、RTK、姿态角及相机内参等关键信息,提升测绘、三维重建及精准农业等项目的成果精度与效率。通过自动化质检脚本与行业应用场景剖析,指导从业者将元数据从信息转化为生产力,实现从拍照到专业测绘的跨越。

dell8的博客 528

Flask学习笔记:时间与日期

1. 做好准备工作进入项目主目录激活虚拟环境2. 时区在服务器上用Python来渲染时间和日期不是个好主意。比如我在2017年9月28日下午4:06写这篇文章。此时我的时区是PDT。在Python解释器中运行得到如下输出:&gt;&gt;&gt; from datetime import datetime &gt;&gt;&gt; str(datetime.now()) '2017-09-28 1...

博客 3352

ZYNQ 系统的IEEE1588 实现方法

zynq IEEE588/PTP 实现方案(讨论稿)

姚家湾博客 1万+

【电商风控】电商风控标注是什么

本篇文章给大家谈谈。

867

python生成日历_利用Python自动化生成逼格高的日历!简单又实用

本次内容有感于《Python编程快速上手-让繁琐工作自动化》。根据书中的「处理Excel电子表格」章节内容,做出一份专属日历。使用的模块为openpyxl,一个能读取和修改Excel电子表格的Pyhton模块。实现自动化处理表格信息,摆脱无趣无味。此外还有calendar模块,通过该模块生成日历信息。最后利用openpyxl和calendar库,实现自动化生成爱豆日历。/ 01 / 科普在进行代码...

weixin_39885803的博客 352

Disk Drill 使用教程

Disk Drill只需单击几下,即可恢复USB闪存驱动器上已删除的数据,包括丢失的照片,文档和其他文件类型。Disk Drill是真正的多合一应用程序,可在Mac上恢复闪存驱动器。Disk Drill将自动应用最佳的笔式驱动器恢复算法来恢复Mac数据。 USB闪存驱动器是一种传输和存储信息的好方法,但是如果错误地丢失或删除了存储在其中的文件,会发生什么呢?当您需要Mac的闪存驱动器数据恢复软件时,Disk Drill是您的最佳选择。Disk Drill将扫描您的USB闪存驱动器(也称为笔式驱动器)并查找

zjj778899的博客 1万+
上一篇: 爱了爱了!GitHub7200星,一个可以听全网无损音乐的神器
下一篇: 6 款 超好用的 Python 时间库
菜鸟学Python
博客等级 码龄9年 8086粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值