我有两个路由,第一个收集两个变量,它们将通过点击提交显示在第二个路由(模板)中。但是,如果我在浏览器上从第二个(/viewtrips)中写入URL,那么这两个变量就不会显示,因为它们从未被选中并存储在全局变量中。所以我想防止这种情况发生。是否有任何命令,例如请求?
第一条路由的代码"
@route('/', method=['GET', 'POST'])
def homepage():
if request.method == 'POST':
planet = request.forms.get('destination') # destination will be selected from a
#dropdown menu and the click will be store and sent here
dateTime = request.forms.get('date')
global formDateTime
global formPlanet
formDateTime = dateTime
formPlanet = planet
redirect('/viewtrips') #send us to the next page
else:
return template('templateHome')
"
第二个:
"
@route('/viewtrips', method=['GET', 'POST'])
def viewTrips():
global formPlanet
global formDateTime
flighttime = flightTime(formPlanet) #giving the variable to a function in another py file
gifPlanet = gifplanet(formPlanet) # returns a gif
planet = formPlanet
datetime = formDateTime
basePrice = planetPrice(formPlanet)
if request.method == 'POST':
seat =request.forms.get('seating')
food = request.forms.get('food')
global formSeat
global formFood
formSeat = seat # values are stored in variables to insert them later in the database
formFood = food
redirect('/information')
return template('templateBooking', flighttime = flighttime, datetime = datetime, gifPlanet = gifPlanet, basePrice = basePrice, destination = planet)
"
第一个模板的HTML:"
<form method="POST">
<label id="to">To:</label>
<select id="destination" name="destination" required>
<option value="" disabled selected>Choose aDestination</option>
<option value="Mercury">Mercury</option>
<option value="Venus">Venus</option>
<option value="Mars">Mars</option>
<option value="Jupiter">Jupiter</option>
<option value="Saturn">Saturn</option>
<option value="Uranus">Uranus</option>
<option value="Neptune">Neptune</option>
</select>
<label for="date" style="margin-left:15px">Date:</label>
<input type="date" id="date" name="date" placeholder="Date" required>
<input type="submit" value="submit">
</form>
"
第二个:
"
<form method="POST">
<p id="chooseseating">Choose your seating:</p>
<input type="radio" id="seating" name="seating" value="Economy" required>
<label for="seating1"> Economy Class ( +20M$ )</label><br>
<input type="radio" id="seating" name="seating" value="Business" required>
<label for="seating2"> Business Class ( +55M$ )</label><br>
<input type="radio" id="seating" name="seating" value="First" required>
<label for="seating3"> First Class ( +70M$ )</label>
<p id="chooseseating">Include Food service?</p>
<input type="radio" id="seating" name="food" value="Yes"required>
<label for="food">Yes ( +2M$ )</label><br>
<input type="radio" id="seating" name="food" value="No"required>
<label for="food">No</label><br>
<input type="submit" value="submit">
</form>
</div>
<div class="box22">
<form method="GET">
<img id="solarsystem" src="{{gifPlanet}}" align="right">
</form>
</div>
"
"
import bottle
from bottle import run, template, route, request, redirect, static_file
from requests import session
from PlanetDestination import flightTime, gifplanet, price, planetPrice
from database import dataInput,extractInfo, delete, editInfo, updateInfo, emailextraction
from Passangers import init_db
import PlanetsGif
import json
import bottle_session
app = bottle.app()
plugin = bottle_session.SessionPlugin(cookie_lifetime=600)
app.install(plugin)
#init_db()
#PlanetsGif.PlanetName_GIF()
#PlanetsGif.SolarSystem_GIF()
# global variables for future purposes
@route('/', method=['GET', 'POST'])
def homepage():
if request.method == 'POST':
planet = request.forms.get('destination')
dateTime = request.forms.get('date')
session['destination'] = planet
session['date'] = dateTime
redirect('/viewtrips') #send us to the next page
else:
return template('templateHome')
"
我的建议是通过使用action={{route}}
属性而不是使用重定向将表单定向到POST到下一页。然后在每个需要前一页表单信息的页面上,如果方法是GET,则重定向回主页。
bottle-session
在会话中存储用户的当前信息。这更像是一个全局变量,将来自多个用户的数据分开。
app.py
@route('/', method=['GET', 'POST'])
def homepage():
return template('templateHome')
@route('/viewtrips', method=['GET', 'POST'])
def viewTrips():
if method == "GET":
redirect('/')
# destination will be selected from a dropdown menu and the click will be store and sent here
planet = request.forms.get('destination')
dateTime = request.forms.get('date')
flighttime = flightTime(planet) #giving the variable to a function in another py file
gifPlanet = gifplanet(planet) # returns a gif
basePrice = planetPrice(planet)
return template('templateBooking', flighttime=flighttime, datetime=dateTime, gifPlanet=gifPlanet, basePrice=basePrice, destination=planet)
@route('/information', method=['GET', 'POST'])
def information():
if method == "GET":
redirect('/')
# seat and food were selected on viewTrips page
# planet and dateTime were selected on homepage and passed as hidden fields.
seat = request.forms.get('seating')
food = request.forms.get('food')
planet = request.forms.get('destination')
dateTime = request.forms.get('date')
return template('templateInformation', destination=planet, food=food, seat=seating, datetime=dateTime)
<<p>templateHomepage形式/strong><form method="POST" action="/viewtrips">
<label for="destiniation" id="to">To:</label>
<select id="destination" name="destination" required>
<option value="" disabled selected>Choose a Destination</option>
<option value="Mercury">Mercury</option>
<option value="Venus">Venus</option>
<option value="Mars">Mars</option>
<option value="Jupiter">Jupiter</option>
<option value="Saturn">Saturn</option>
<option value="Uranus">Uranus</option>
<option value="Neptune">Neptune</option>
</select>
<label for="date" style="margin-left:15px">Date:</label>
<input type="date" id="date" name="date" placeholder="Date" required>
<input type="submit" value="submit">
</form>
<<p>templateViewTrips形式/strong><form method="POST" action="/information">
<!-- Keep needed trip details in hidden input fields -->
<input type="hidden" id="destination" name="destination" value={{destination}}>
<input type="hidden" id="date", name="date", value={{datetime}}>
<p id="chooseseating">Choose your seating:</p>
<input type="radio" id="seating" name="seating" value="Economy" required>
<label for="seating1"> Economy Class ( +20M$ )</label><br>
<input type="radio" id="seating" name="seating" value="Business" required>
<label for="seating2"> Business Class ( +55M$ )</label><br>
<input type="radio" id="seating" name="seating" value="First" required>
<label for="seating3"> First Class ( +70M$ )</label>
<p id="chooseseating">Include Food service?</p>
<input type="radio" id="seating" name="food" value="Yes"required>
<label for="food">Yes ( +2M$ )</label><br>
<input type="radio" id="seating" name="food" value="No"required>
<label for="food">No</label><br>
<input type="submit" value="submit">
</form>
</div>
<div class="box22">
<form method="GET">
<img id="solarsystem" src="{{gifPlanet}}" align="right">
</form>
</div>
注意-我没有纠正你的viewTrips表单,你有多个字段使用相同的id和名称,这似乎是复制粘贴错误。此外,它不清楚{{gifPlanet}}应该在<form>
作为其不可操作。
使用瓶会话,不导入from requests import session
。请求。无论如何,session现在已经被弃用了,但是这样做也会重载引用session
并导致问题。
相反,在安装插件后,您需要将session
作为关键字参数添加到将访问会话的每个路由。参考:https://pypi.org/project/bottle-session/
import bottle
from bottle import run, template, route, request, redirect, static_file
# from requests import session
from PlanetDestination import flightTime, gifplanet, price, planetPrice
from database import dataInput,extractInfo, delete, editInfo, updateInfo, emailextraction
from Passangers import init_db
import PlanetsGif
import json
import bottle_session
app = bottle.app()
plugin = bottle_session.SessionPlugin(cookie_lifetime=600)
app.install(plugin)
#init_db()
#PlanetsGif.PlanetName_GIF()
#PlanetsGif.SolarSystem_GIF()
# global variables for future purposes
@route('/', method=['GET', 'POST'])
def homepage(session):
if request.method == 'POST':
planet = request.forms.get('destination')
dateTime = request.forms.get('date')
session['destination'] = planet
session['date'] = dateTime
redirect('/viewtrips') #send us to the next page
else:
return template('templateHome')