Flask Post方法意外的关键字参数

1 投票
2 回答
27 浏览
提问于 2025-04-14 18:37

我想在一个路由上执行两个操作:

  1. 我想显示来自jobs表格的特定ID的信息,这个ID是在前一页提供的。

  2. 在点击申请按钮后,我想在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 请求应该用第二个函数。

撰写回答