Flask - 405 方法不允许使用 methods=['GET, POST']
Flask - 405 Method not allowed with methods=['GET, POST']
bp_booking = Blueprint('booking', __name__, url_prefix='/booking', template_folder='templates/booking')
@bp_booking.route('<screening>', methods=["GET", "POST"])
def seat_select(screening):
cur = db.connection.cursor()
cur.execute("""SELECT M.title, S.Screening_Start
FROM screening S JOIN movie M ON s.movie_id = M.id
WHERE S.id = (%s)""", (screening,))
screening_details = cur.fetchone()
title = screening_details[0]
time = screening_details[1].strftime('%d %B %H:%M')
cur.execute("""SELECT A.row_count, A.column_count
FROM auditorium A JOIN screening S on S.auditorium_id = A.id
WHERE S.id = (%s)""", (screening,))
screen_no = cur.fetchone()
row = screen_no[0]
column = screen_no[1]
return render_template('booking/seatSelect.html', screeningId=screening,
title=title, time=time, rows=row, columns=column)
@bp_booking.route('/process-ticket', methods=['GET, POST'])
def process_ticket():
ticket_value = request.form.get('hidden-ticket-value')
## insert into database here
return 'Ticket inserted into database'
seatSelect.html
<div id="container">
</div>
<div id = "right">
<p id= "quantity">
Select your seats!
</p>
<form method="POST" action="{{ url_for('booking.process_ticket') }}">
<input type="hidden" id="hidden" name="hidden-ticket-value">
<input type="submit" value="Book" id="book-btn">
</form>
</div>
</body>
seatSelect.html 有一些额外的 javascript 和 css 来制定座位计划,所选座位存储在隐藏字段的值中。
单击提交时,我想转到处理单
<form method="POST" action="{{ url_for('booking.process_ticket') }}">
而是使用参数 screening=process-ticket
再次调用 seat_select(screening)
函数
这只是抛出错误,因为我的函数需要一个数字。知道为什么会这样吗?
我尝试对 HTML 进行硬编码以将 URL 用于 process_ticket()
,同样的事情发生了。
编辑:我稍微更改了 select_seat()
的路线,现在 process_ticket()
似乎是 运行 但我收到 405 方法不允许错误。如果 methods=['GET, POST']
出现在函数中,是否应该发生这种情况?
至于我的问题可能是因为 <screening>
可以匹配任何字符串 - 甚至 /process-ticket
- 并且 route("<screening>"...)
是第一个检查 - 在 route("/process-ticket")
[=25= 之前]
Flask 首先将地址 /process-ticket
与 route("<screening>"...)
进行比较,结果匹配,因此它不与 route("/process-ticket")
进行检查,而是运行 seat_select(screening="process-ticket")
.
你必须把函数 def process_ticket()
放在 def seat_select()
之前,然后 flask 会首先检查地址 /process-ticket
和 route("/process-ticket")
。
或者您应该使用 <int:screening>
只匹配数字,然后地址 /process-ticket
将不会匹配到 <int:screening>
bp_booking = Blueprint('booking', __name__, url_prefix='/booking', template_folder='templates/booking')
@bp_booking.route('<screening>', methods=["GET", "POST"])
def seat_select(screening):
cur = db.connection.cursor()
cur.execute("""SELECT M.title, S.Screening_Start
FROM screening S JOIN movie M ON s.movie_id = M.id
WHERE S.id = (%s)""", (screening,))
screening_details = cur.fetchone()
title = screening_details[0]
time = screening_details[1].strftime('%d %B %H:%M')
cur.execute("""SELECT A.row_count, A.column_count
FROM auditorium A JOIN screening S on S.auditorium_id = A.id
WHERE S.id = (%s)""", (screening,))
screen_no = cur.fetchone()
row = screen_no[0]
column = screen_no[1]
return render_template('booking/seatSelect.html', screeningId=screening,
title=title, time=time, rows=row, columns=column)
@bp_booking.route('/process-ticket', methods=['GET, POST'])
def process_ticket():
ticket_value = request.form.get('hidden-ticket-value')
## insert into database here
return 'Ticket inserted into database'
seatSelect.html
<div id="container">
</div>
<div id = "right">
<p id= "quantity">
Select your seats!
</p>
<form method="POST" action="{{ url_for('booking.process_ticket') }}">
<input type="hidden" id="hidden" name="hidden-ticket-value">
<input type="submit" value="Book" id="book-btn">
</form>
</div>
</body>
seatSelect.html 有一些额外的 javascript 和 css 来制定座位计划,所选座位存储在隐藏字段的值中。
单击提交时,我想转到处理单
<form method="POST" action="{{ url_for('booking.process_ticket') }}">
而是使用参数 screening=process-ticket
再次调用 seat_select(screening)
函数
这只是抛出错误,因为我的函数需要一个数字。知道为什么会这样吗?
我尝试对 HTML 进行硬编码以将 URL 用于 process_ticket()
,同样的事情发生了。
编辑:我稍微更改了 select_seat()
的路线,现在 process_ticket()
似乎是 运行 但我收到 405 方法不允许错误。如果 methods=['GET, POST']
出现在函数中,是否应该发生这种情况?
至于我的问题可能是因为 <screening>
可以匹配任何字符串 - 甚至 /process-ticket
- 并且 route("<screening>"...)
是第一个检查 - 在 route("/process-ticket")
[=25= 之前]
Flask 首先将地址 /process-ticket
与 route("<screening>"...)
进行比较,结果匹配,因此它不与 route("/process-ticket")
进行检查,而是运行 seat_select(screening="process-ticket")
.
你必须把函数 def process_ticket()
放在 def seat_select()
之前,然后 flask 会首先检查地址 /process-ticket
和 route("/process-ticket")
。
或者您应该使用 <int:screening>
只匹配数字,然后地址 /process-ticket
将不会匹配到 <int:screening>