Flask中如何区分首次访问与表单提交场景为日历页设置不同日期逻辑
Flask日历页面参数重置问题修复方案
后端代码修正
核心调整点:
- 修正原有代码的缩进错误
- 引入POST/Redirect/GET(PRG)模式避免表单重复提交
- 区分首次GET请求和表单提交后的请求,首次访问默认使用最近一周日期
修正后代码:
from flask import request, redirect, url_for import datetime as dt import pandas as pd import os SECRET_KEY = os.urandom(32) app.config['SECRET_KEY'] = SECRET_KEY @app.route('/calendar', methods=['POST','GET']) def calendar(): # 首次GET请求默认使用最近一周 start_date_dt = dt.datetime.now() - dt.timedelta(7) end_date_dt = dt.datetime.now() # POST提交时取用户选择的日期,重定向到GET请求带参数 if request.method == 'POST': start = request.form['start'] end = request.form['end'] return redirect(url_for('calendar', start=start, end=end)) # GET请求如果带日期参数就用参数值,否则保留默认值 if request.args.get('start'): start_date_dt = pd.to_datetime(request.args.get('start')) if request.args.get('end'): end_date_dt = pd.to_datetime(request.args.get('end')) av_start_date = start_date_dt.strftime('%Y-%m-%d %H:%M') av_end_date = end_date_dt.strftime('%Y-%m-%d %H:%M') df = av_query(av_start_date, av_end_date, '44201') # 原有查询和数据处理逻辑保持不变 # 把当前使用的起止日期传给模板,用于表单默认显示 return render_template('calendar.html', title='Ozone Data', data_sets=zip(sites,datasets,cmap), sites=sites, current_start=start_date_dt.strftime('%Y-%m-%d'), current_end=end_date_dt.strftime('%Y-%m-%d'))
前端代码修正
核心调整点:
- 移除不必要的
enctype属性(仅上传文件时需要) - 给日期输入框设置默认值,显示当前正在使用的日期,新增必填校验避免空提交
修正后代码:
<form action="{{url_for('calendar')}}" method="post"> <label for="start">Start:</label> <input type="date" id="start" name="start" value="{{ current_start }}" required> <label for="end">End:</label> <input type="date" id="end" name="end" value="{{ current_end }}" required> <input type="submit" value="Submit"> </form>
效果说明
- 用户直接访问
mysite.com/calendar时,没有查询参数,默认加载最近一周数据,表单显示对应默认日期 - 用户提交表单后,会跳转到带日期参数的url,加载所选时间段数据
- 用户重新在地址栏输入
mysite.com/calendar访问时,自动清空参数,回到默认最近一周配置,不会复用上次提交的参数
内容的提问来源于stack exchange,提问作者bart cubrich
相关产品推荐
相关产品推荐

