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

news2024/12/21 14:02:10

0. 运行效果

运行代码,然后在浏览器中访问 http://127.0.0.1:5000/,将看到一个动态日历,能够通过点击按钮切换月份。

在这里插入图片描述

1. 安装 Flask

首先,确保你已经安装了Flask。如果没有,可以使用以下命令安装:

pip install Flask

测试:

from flask import Flask
#from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/')
#@app.route('/', methods=['GET', 'POST'])
def hello_world():
    return 'Hello, World!'
    #return render_template('calendar.html')
# 仅在开发环境中使用
if __name__ == '__main__':
    app.run(debug=True)  # 仅用于开发环境

在这里插入图片描述
打开 http://127.0.0.1:5000 ,可看到helloworld
在这里插入图片描述

2. 项目结构

/项目目录
├── app.py
├── static
│   └── bg.jpg  # 确保你将背景图放在这里
└── templates
    └── calendar.html

3. 创建 Flask 应用

接下来,创建一个名为 app.py 的文件。
导入必要的库:

from flask import Flask, render_template, request
import calendar
from datetime import datetime

其中,render_template: 用于渲染 HTML 模板。request: 用于处理 HTTP 请求数据。calendar: Python 的日历模块,用于生成日历。datetime: 用于获取当前日期和时间。

创建 Flask 应用,__name__ 表示当前模块的名称。

app = Flask(__name__)

定义路由

@app.route('/', methods=['GET', 'POST'])

使用 datetime.now() 获取当前时间,并提取出当前的年月份。

now = datetime.now()  # Get current date and time
year = now.year
month = now.month

表单提交,如果请求是 POST 方法(通常是表单提交),则从表单中获取用户选择的月份和年份。根据用户的操作(前一个月或下一个月),更新 month 和 year 变量。

if request.method == 'POST':
    month = int(request.form.get('month'))
    year = int(request.form.get('year'))
    if request.form.get('action') == 'prev':
        if month == 1:
            month = 12
            year -= 1
        else:
            month -= 1
    elif request.form.get('action') == 'next':
        if month == 12:
            month = 1
            year += 1
        else:
            month += 1

生成日历,渲染html模板

cal = calendar.monthcalendar(year, month)
month_year = f"{year}{month}月"
return render_template('calendar.html', calendar=cal, month_year=month_year, year=year, month=month, now=now)

代码如下:

from flask import Flask, render_template, request
import calendar
from datetime import datetime
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
    now = datetime.now()  # Get current date and time
    year = now.year
    month = now.month
    if request.method == 'POST':
        month = int(request.form.get('month'))
        year = int(request.form.get('year'))
        if request.form.get('action') == 'prev':
            if month == 1:
                month = 12
                year -= 1
            else:
                month -= 1
        elif request.form.get('action') == 'next':
            if month == 12:
                month = 1
                year += 1
            else:
                month += 1
    # Generate calendar
    cal = calendar.monthcalendar(year, month)
    month_year = f"{year}{month}月"
    return render_template('calendar.html', calendar=cal, month_year=month_year, year=year, month=month, now=now)
if __name__ == '__main__':
    app.run(debug=True)

4. 创建 HTML 模板

在与 app.py 相同的目录下,创建一个名为 templates 的文件夹,并在其中创建一个名为 calendar.html 的文件,添加代码:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>动态日历</title>
    <style>
        body {
            background: url('/static/bg.jpg') no-repeat center center fixed;
            background-size: cover;
            margin: 0;
            padding: 20px;
            font-family: Arial, sans-serif;
        }
        .calendar-container {
            position: absolute;
            top: 50px;
            left: 50px;
            width: 300px;
            border: 2px solid white;
            border-radius: 10px;
            background: rgba(255, 255, 255, 0.9);
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
            padding: 10px;
        }
        table {
            width: 100%;
            border-collapse: collapse;
        }
        th, td {
            text-align: center;
            padding: 10px;
            border: 1px solid #ddd;
        }
        .today {
            background-color: red;
            color: white;
        }
        .header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 10px;
        }
        .button {
            cursor: pointer;
            font-size: 1.2em;
            padding: 5px 10px;
            background: lightgray;
            border: none;
            border-radius: 5px;
        }
    </style>
</head>
<body>
<div class="calendar-container">
    <div class="header">
        <form method="post" style="display: inline;">
            <input type="hidden" name="month" value="{{ month }}">
            <input type="hidden" name="year" value="{{ year }}">
            <button class="button" name="action" value="prev">&#9664;</button>
        </form>
        <span>{{ month_year }}</span>
        <form method="post" style="display: inline;">
            <input type="hidden" name="month" value="{{ month }}">
            <input type="hidden" name="year" value="{{ year }}">
            <button class="button" name="action" value="next">&#9654;</button>
        </form>
    </div>
    <table>
    <tr>
        <th></th>
        <th></th>
        <th></th>
        <th></th>
        <th></th>
        <th></th>
        <th></th>
    </tr>
    {% for week in calendar %}
    <tr>
        {% for day in week %}
        {% if day == 0 %}
        <td></td>
        {% else %}
        <td {% if day == now.day and year == now.year and month == now.month %}class="today"{% endif %}>{{ day }}</td>
        {% endif %}
        {% endfor %}
    </tr>
    {% endfor %}
</table>
</div>
</body>
</html>

背景图路径设置,Flask 会自动为 static 目录中的文件处理 URL,因此可以这样引用它:

background: url('/static/bg.jpg');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2263261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一键优化Linux服务器性能(One Click Optimization of Linux Server Performance)

服务器上线之一键优化Linux服务器性能 以下是一个简单的Shell脚本&#xff0c;用于执行服务器上线优化的一些基本步骤。请注意&#xff0c;这个脚本是基于一个通用的Linux服务器配置&#xff0c;您可能需要根据您的具体需求和环境进行调整。 功能如下&#xff1a; 1.关闭SEL…

【电脑技巧】将键盘的方向键映射为alt+i、k、j、l

最近感觉方向键太远了&#xff0c;想找个方法修改键盘映射&#xff0c;有几种方式可以实现 使用powertoys的键盘映射&#xff08;软件太大了&#xff0c;只为键盘映射不值得下这个&#xff09;使用autohotkey&#xff08;通过脚本的方式&#xff0c;可以打包成exe文件&#xf…

apache-tomcat-6.0.44.exe Win10

apache-tomcat-6.0.44.exe Win10

文件防泄漏 | 文件防泄漏软件解决方案分享,网络数据泄露防护系统

文件防泄漏 | 文件防泄漏软件解决方案分享&#xff0c;网络数据泄露防护系统 企业面临的一大挑战是数据安全和隐私保护。 网络数据泄露不仅会导致经济损失&#xff0c;还会损害企业的声誉和客户关系。 为了应对这一挑战&#xff0c;域智盾软件应运而生&#xff0c;成为众多企…

11篇--图像边缘检测

图像梯度 要学习图像边缘检测&#xff0c;要先了解图像梯度的概念&#xff0c;我们正是通过梯度值来区分边缘像素点的 处于边缘附近的像素点与周围像素点的差距很大&#xff08;不然不会有边缘呈现&#xff09;&#xff0c;所以给边缘附近的的梯度之变化很快&#xff0c;通过…

细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV

目录 一、工程配置 1、时钟、DEBUG 2、GPIO 3、SPI2 4、USART6 5、NVIC 二、软件设计 1、FALSH &#xff08;1&#xff09;w25flash.h &#xff08;2&#xff09; w25flash.c 1&#xff09;W25Q16基本操作指令 2&#xff09;计算地址的辅助功能函数 3&#xff09;器…

.net core在linux导出excel,System.Drawing.Common is not supported on this platform

使用框架 .NET7 导出组件 Aspose.Cells for .NET 5.3.1 asp.net core mvc 如果使用Aspose.Cells导出excel时&#xff0c;报错 &#xff1a; System.Drawing.Common is not supported on this platform 平台特定实现&#xff1a; 对于Windows平台&#xff0c;System.Drawing.C…

岁末回望,追梦远方

又到了岁末年初&#xff0c;按惯例&#xff0c;风云我都会写一篇长长的感悟&#xff0c;给自己辞旧的总结复盘&#xff0c;迎新的追梦定调&#xff0c;今年赋诗一首&#xff0c;畅想一下诗和远方&#xff0c;简洁而又虚无&#xff0c;缥缈中坚定初心。 岁末回首步履深&#xf…

作业Day4: 链表函数封装 ; 思维导图

目录 作业&#xff1a;实现链表剩下的操作&#xff1a; 任意位置删除 按位置修改 按值查找返回地址 反转 销毁 运行结果 思维导图 作业&#xff1a;实现链表剩下的操作&#xff1a; 1>任意位置删除 2>按位置修改 3>按值查找返回地址 4>反转 5>销毁 任意…

多个Echart遍历生成 / 词图云

echart官网 安装 如果版本报错推荐安装以下版本 npm install echarts4.8.0 --savenpm uninstall echarts//这个是卸载命令以下安装成功后是局部引入:多个Echart遍历生成 vue3echart单个页面多个图表循环渲染展示:<template><div class"main"><div …

混凝土-钢板结构抗剪性能DIC全场应变测试

混凝土-钢板结构发挥了钢板抗拉及混凝土抗压的特点&#xff0c;为建筑设计、选材、施工等过程带来了更多的可能性。构件将混凝土与钢板结合&#xff0c;从而改善抗剪承载性能&#xff0c;提升建筑性能。 采用3D-DIC非接触式三维全场应变测量技术&#xff0c;对构件的抗剪承载力…

网络安全渗透有什么常见的漏洞吗?

弱口令与密码安全问题 THINKMO 01 暴力破解登录&#xff08;Weak Password Attack&#xff09; 在某次渗透测试中&#xff0c;测试人员发现一个网站的后台管理系统使用了非常简单的密码 admin123&#xff0c;而且用户名也是常见的 admin。那么攻击者就可以通过暴力破解工具&…

音频开发中常见的知识体系

在 Linux 系统中&#xff0c;/dev/snd 目录包含与声音设备相关的文件。每个文件代表系统中的一部分音频硬件或音频控制接口。以下是你列出的文件及其含义&#xff1a; 一.基本术语 样本长度(sample)&#xff1a;样本是记录音频数据最基本的单位&#xff0c;计算机对每个通道采…

Linux setfacl 命令详解

文章目录 Linux setfacl 命令详解一、ACL 和 setfacl 简介二、基本语法三、常用操作1. 查看 ACL2. 为用户设置权限3. 为组设置权限4. 删除 ACL 条目5. 设置默认 ACL6. 递归设置 ACL 四、示例操作1. 创建示例目录和文件2. 设置 ACL3. 验证 ACL 五、注意事项六、总结 Linux setfa…

编程训练系统(代码+数据库+LW)

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了编程训练系统的开发全过程。通过分析编程训练系统管理的不足&#xff0c;创建了一个计算机管理编程训练系统的方案。文章介绍了编程训练系统的系统分析部分&…

提炼关键词的力量:AI驱动下的SEO优化策略

内容概要 在当今数字化营销的环境中&#xff0c;关键词对于提升网站的可见性和流量起着至关重要的作用。企业和个人必须重视有效的关键词策略&#xff0c;以便在竞争激烈的网络市场中脱颖而出。本文将深入探讨如何利用人工智能技术来优化SEO策略&#xff0c;特别是在关键词选择…

【Where语法全解密】.NET开源ORM框架 SqlSugar 系列

文章目录 前言一、普通表达式查询 Where二、根据SQL查询 where三、动态查询四、动态拼表达式查询 &#xff0c;拼拉姆达五、条件拼接查询六、链式条件查询七、根据Class查询&#xff0c;根据实查询八、根据Class中主键查询九、根据字典查询十、查询函数十一、Where中有子查询十…

模型优化之知识蒸馏

文章目录 知识蒸馏优点工作原理示例代码 知识蒸馏优点 把老师模型中的规律迁移到学生模型中&#xff0c;相比从头训练&#xff0c;加快了训练速度。另一方面&#xff0c;如果学生模型的训练精度和老师模型差不多&#xff0c;相当于得到了规模更小的学生模型&#xff0c;起到模…

电脑问题4[非华为电脑安装华为电脑管家华为荣耀手机多屏协助]

非华为电脑安装华为电脑管家华为荣耀手机多屏协助 我是荣耀手机之前一直用的是window的"连接手机"功能,电脑控制手机还蛮好用,但是又不能够没有好的电脑控制手机的功能,后来想了想看了看,竟然安装了华为电脑关键,竟然可以顺利连接上荣耀手机,发现还蛮好用! 本文引用…

win11 C盘出现感叹号解决方法

出现感叹号&#xff0c;原因是对C盘进行了BitLocker驱动器加密操作。如果想去除感叹号&#xff0c;对C盘进行BitLocker解密即可。 步骤如下&#xff1a; 1.点击Windows搜索框 2.搜索框内输入 系统 3.按下回车&#xff0c;进入系统界面 4.点击隐私和安全性 点击BitLocker驱…