Python-Bottle限制用户在浏览器上编写URL并跳过前一页



我有两个路由,第一个收集两个变量,它们将通过点击提交显示在第二个路由(模板)中。但是,如果我在浏览器上从第二个(/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')

最新更新