Python-Bottle框架如何禁止用户直接输入URL跳过前置页面访问
Bottle路由前置访问控制实现方案
完全可以通过你已经集成的bottle_session插件实现该访问控制,不需要额外引入其他组件,实现逻辑如下:
- 彻底弃用全局变量存储用户表单参数的写法:全局变量为服务端所有用户共享,并发场景下会出现不同用户数据串扰的问题,所有跨路由的用户级临时数据统一存入session。
- 在
/viewtrips路由的业务逻辑最前端增加必填参数校验:检查session中是否存在destination、date两个核心依赖参数,若任意参数缺失,直接重定向回首页/,不执行后续的函数调用、模板渲染逻辑,从根源避免空参数导致的页面渲染错误。 - 可选优化:校验不通过时可在session中写入提示信息,首页渲染时读取该信息展示给用户,明确告知用户需要先完成首页表单提交。
修正后可直接运行的代码
1. 修正项目初始化导入问题
你当前代码中存在导入错误,from requests import session这行代码会导入requests库的session对象,和bottle_session注入到路由上下文的session对象冲突,直接删除这行导入即可。
2. 修正后的根路由/代码
@route('/', method=['GET', 'POST']) def homepage(): if request.method == 'POST': planet = request.forms.get('destination') dateTime = request.forms.get('date') # 表单参数存入session session['destination'] = planet session['date'] = dateTime redirect('/viewtrips') else: return template('templateHome')
3. 增加访问校验后的/viewtrips路由代码
@route('/viewtrips', method=['GET', 'POST']) def viewTrips(): # 前置访问校验:核心参数缺失时直接跳转回首页 if 'destination' not in session or 'date' not in session: redirect('/') # 校验通过后读取参数执行业务逻辑 formPlanet = session['destination'] formDateTime = session['date'] flighttime = flightTime(formPlanet) gifPlanet = gifplanet(formPlanet) planet = formPlanet datetime = formDateTime basePrice = planetPrice(formPlanet) if request.method == 'POST': seat = request.forms.get('seating') food = request.forms.get('food') # 座位、餐食参数同样存入session,不要用全局变量 session['seating'] = seat session['food'] = food redirect('/information') return template('templateBooking', flighttime = flighttime, datetime = datetime, gifPlanet = gifPlanet, basePrice = basePrice, destination = planet)
补充说明
- 该校验逻辑同样适用于后续的
/information路由,只需要在路由入口检查session中是否存在seating、food等前置步骤提交的参数,缺失时重定向到/viewtrips即可,实现全流程的访问控制。 - 你配置的session cookie有效期为600秒,用户停留超过10分钟后session会自动过期,此时访问
/viewtrips也会被自动重定向回首页,符合业务逻辑。
内容的提问来源于stack exchange,提问作者ed190
相关产品推荐
相关产品推荐

