Flask Post方法意外的关键字参数
我想在一个路由上执行两个操作:
我想显示来自jobs表格的特定ID的信息,这个ID是在前一页提供的。
在点击申请按钮后,我想在dashboard表格中插入一条新记录。
终端显示我遇到的问题是:
dashboard_add() 收到了一个意外的参数 'job_id'
这是我的Python代码:
@app.route('/jobs/<job_id>')
def job_detailed_view(job_id):
detailed_view = fetch_specific(job_id)
return render_template('detailed-view.html', job=detailed_view)
def fetch_specific(job_id):
query = """
SELECT * FROM jobs
WHERE job_id = %(job_id)s
"""
return execute_select(query, {'job_id': job_id}, False)
@app.route('/jobs/<job_id>', methods=['POST'])
def dashboard_add():
apply_date = datetime.now()
apply_date.strftime("%d/%m/%y")
applied_job_id = int(request.form.get('add_item_index', 0))
apply_job(applied_job_id, apply_date)
return redirect('home')
def apply_job(job_id, apply_date):
execute_insert ("""
INSERT INTO dashboard (job_id, apply_date)
VALUES
(%(job_id)s, %(apply_date)s)
""", {'job_id': job_id, 'apply_date': apply_date})
还有HTML看起来是这样的:
第一段代码是重定向到带有特定ID的页面,第二段代码应该将数据传递给POST方法。
<div class="job-title">
<a href="{{ "/jobs/" + (job['job_id']|string) }}">{{job['job_title']}}</a>
</div>
<form method="post" action="{{ "/jobs/" + (job['job_id']|string)}}">
<input type="hidden" name="add_item_index" value="3">
<button class="apply" type="submit" name="add_item">
Apply
</button>
</form>
你们觉得我哪里做错了吗?
我创建了一个路由,并用两个不同的函数来避免在一个路由中执行两个操作。
2 个回答
0
这个回答是对John Gordon的回答的补充,后者已经解答了你的问题。
另一种方法是检查请求的方法是GET
还是POST
,然后根据不同的方法调用相应的辅助函数,而不是像下面的例子那样使用不同的URL。
需要注意的是,我没有办法测试这段代码,所以可能会有一些小错误。另外,你可能不需要第一个@app.route('/jobs/', methods=('GET', 'POST'))
。
@app.route('/jobs/', methods=('GET', 'POST'))
@app.route('/jobs/<job_id>', methods=('GET', 'POST'))
def jobs_job_id(job_id=None):
job_id = request.form.get('add_item_index', job_id)
# redirect if GET w/ no job_id, or POST w/ no add_item_index
if job_id is None:
return redirect('home')
if request.method == 'POST':
return dashboard_add(int(job_id))
return job_detailed_view(job_id)
def job_detailed_view(job_id):
detailed_view = fetch_specific(job_id)
return render_template('detailed-view.html', job=detailed_view)
def fetch_specific(job_id):
query = """
SELECT * FROM jobs
WHERE job_id = %(job_id)s
"""
return execute_select(query, {'job_id': job_id}, False)
def dashboard_add(job_id):
apply_job(job_id, datetime.now().strftime("%d/%m/%y"))
return redirect('home')
def apply_job(job_id, apply_date):
query = """
INSERT INTO dashboard (job_id, apply_date)
VALUES
(%(job_id)s, %(apply_date)s)
"""
execute_insert(query , {'job_id': job_id, 'apply_date': apply_date})
0
这是 job_detailed_view()
这个视图函数的 URL 路由定义:
@app.route('/jobs/<job_id>')
这是 dasboard_add()
这个视图函数的 URL 路由定义:
@app.route('/jobs/<job_id>', methods=['POST'])
这两个 URL 是一模一样的。不要这样做。请使用不同的 URL。
Flask 不会像你想的那样,自动识别 GET 请求应该用第一个视图函数,而 POST 请求应该用第二个函数。