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

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

image.png


嚣张的面试开场


面试官:小伙子,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)会返回一个原组,但如同下面的情况:

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

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

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

针对返回的数据,使用Jinjia2模板进行循环获取,要注意一点是,如果是日期是0的,代表站位符,需要进行替换。

但如果整行都是零,会导致Bootstrap的表单样式变更,故使用&nbsp进行占位操作。

最终HTML代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Flask Calendar</title>
    <link rel="icon" href="{{ url_for('static',filename='favicon.ico') }}">
    <link href="{{ url_for('static',filename='bootstrap.min.css') }}" rel="stylesheet">
</head>
<body>
<div class="container">
    <h3 class="text-center">Welcome to Flask Calendar {{date.year}} <small><a href="https://www.jianshu.com/u/d23fd5012bed"> 清风Python</a></small></h3>
    {% set week_addr = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] %}
    {% for month_addr,monthInfo in content.items()%}
    <div class="col-lg-3">
        <h4 class="text-center">{{month_addr}}</h4>
        {% with _month=false %}
        {% if month_addr == this_month %}
            <table style='background-color:#a6e1ec' class="table table-bordered">
            {% set _month = true %}
        {% else %}
            <table class="table table-bordered">
        {% endif %}
                <tr>
                    {% for addr in week_addr %}
                        <th>{{addr}}</th>
                    {% endfor %}
                </tr>
                {% for weeks in monthInfo %}
                <tr>
                    {% for day in weeks %}
                    {% if day == 0 %}
                    <td>&nbsp</td>
                    {% elif _month== true and day == date.day %}
                    <td style="background-color:hotpink;">{{ day }}</td>
                    {% else %}
                    <td>{{ day }}</td>
                    {% endif %}
                    {% endfor %}
                </tr>
                {% endfor %}
                {% endwith %}
            </table>
    </div>
    {% endfor %}
</div>
</body>
<footer class="text-center "><strong><a href="https://www.jianshu.com/u/d23fd5012bed">Flask Calendar By:清风Python</a></strong></footer>
</html>

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

image.png


当天高亮效果


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

image.png


完整效果

完整代码:

image.png


代码目录

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/6/4 06:01
# @Software : PyCharm
# @version  :Python 3.6.8
# @File     : index.py
from flask import Flask, render_template, request, session, redirect, url_for
import calendar
from datetime import datetime
calendar.setfirstweekday(firstweekday=6)
app = Flask(__name__)
week = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
def calc_calender(date):
    year = date.year
    yearInfo = dict()
    for month in range(1, 13):
        days = calendar.monthcalendar(year, month)
        if len(days) != 6:
            days.append([0 for _ in range(7)])
        month_addr = calendar.month_abbr[month]
        yearInfo[month_addr] = days
    return yearInfo
@app.route('/', methods=["GET", "POST"])
def index():
    if request.method == "GET":
        date = datetime.today()
        this_month = calendar.month_abbr[date.month]
        return render_template('index.html', this_month=this_month, date=date, content=calc_calender(date))
if __name__ == '__main__':
    app.run(debug=True)


The End

相关文章
|
9月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
634 4
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
|
前端开发 JavaScript Shell
鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。
|
JSON 开发框架 自然语言处理
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
本文主要介绍了应用开发中的三大核心内容:生命周期管理、资源限定与访问以及多语言支持。在生命周期部分,详细说明了应用和页面的生命周期函数及其触发时机,帮助开发者更好地掌控应用状态变化。资源限定与访问章节,则聚焦于资源限定词的定义、命名规则及匹配逻辑,并阐述了如何通过 `$r` 引用 JS 模块内的资源。最后,多语言支持部分讲解了如何通过 JSON 文件定义多语言资源,使用 `$t` 和 `$tc` 方法实现简单格式化与单复数格式化,为全球化应用提供便利。
392 104
|
IDE 开发工具 Python
魔搭notebook在web IDE下,使用jupyter notebook,python扩展包无法更新升级
魔搭notebook在web IDE下,使用jupyter notebook,python扩展包无法更新升级,不升级无法使用,安装python扩展包的时候一直停留在installing
352 4
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的商城管理系统源码+运行步骤
基于Python+Vue开发的商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的网上商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
574 7
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的婚恋交友管理系统源码+运行步骤+课程作品
基于Python+Vue开发的婚恋交友管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的婚恋相亲交友系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习问题可以留言哦
210 9
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的家具商城管理系统源码+运行步骤
基于Python+Vue开发的家具商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的家具商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
231 8
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的反诈视频宣传管理系统源码+运行步骤
基于Python+Vue开发的反诈视频宣传管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的反诈宣传管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
305 6