python - 具有可变输入的 Flask url

标签 python flask

我试图让我的按钮重定向到程序中的路径,并使用一些变量值动态生成 pdf,pdf 生成会自行工作,但是当我提交表单而不是转到 genreport/{{lid}/{{userID}} 时 我去genreport//?userID=3

我的表单的代码

<form action="/genreport/{{lid}}/{{userID}}">
          <input type="number" placeholder="ID" id="userID" name="userID">
      <select>
          <option value="1" id="lid" name="lid">{{letter.description}}</option>
      </select>
          <input type="submit" value="Generate Report">
      </form>
  </div>

我的路线代码

@app.route('/genreport/<lid>/<userID>')
def pdf_template():
    lid = request.form['lid']
    userID = request.form['userID']
    policy = Policy.query.get(request.form[userID])
    letter = Letter.query.get(request.form[lid])
    rendered = render_template_string(letter.template, policy=policy, lid=lid, userID=userID)
    pdf = pdfkit.from_string(rendered, False)

    response = make_response(pdf)
    response.headers['Content-Type'] = 'application/pdf'
    response.headers['Content-Disposition'] = 'inline; filename=output.pdf'

    return response

任何帮助将不胜感激,因为我在这个问题上花了很多时间。如果需要更多信息,我可以提供。

编辑

以下是我的申请的所有路线以及自发布问题以来我所做的更改

@app.route('/')
@login_required
def index():
    return render_template('index.html')


@app.route('/reports', methods=['GET','POST'])
@login_required
def reports():
    if request.method == "GET":
        return render_template('reports.html')
    letter = Letter.query.get(1)
    first = request.form['searchFirst']
    contact = Contact.query.filter_by(first=first).first()
    return render_template('results.html', contact=contact, letter=letter)


@app.route('/results', methods=['GET','POST'])
@login_required
def results():
    return render_template('results.html')


@app.route('/management')
@login_required
def management():
    return render_template('management.html')


@app.route('/history')
@login_required
def history():
    return render_template('history.html')


@app.route('/settings')
@login_required
def settings():
    return render_template('settings.html')


@app.route('/login', methods=['GET','POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    username = request.form['inputEmail']
    password = request.form['inputPassword']
    remember_me = False
    if 'remember_me' in request.form:
        remember_me = True
    registered_user = User.query.filter_by(username=username, password=password).first()
    if registered_user is None:
        flash('Username or Password is invalid', 'error')
        return redirect(url_for('login'))
    login_user(registered_user, remember=remember_me)
    flash('Logged in Successfully')
    return redirect(request.args.get('next') or url_for('index'))


@app.route('/logout')
def logout():
    logout_user()
    return redirect(url_for('index'))


@app.route('/signup', methods=['GET', 'POST'])
def signup():
    if request.method == 'GET':
        return render_template('signup.html')
    user = User(request.form['inputFirst'], request.form['inputLast'], request.form['inputEmail'], request.form['dob'], request.form['inputPassword', request.form['inputStreet'],request.form['inputState'],request.form['inputCity'],request.form['inputZip'],request.form['inputPhone']])
    db.session.add(user)
    db.session.commit()
    flash('User successfully created!')
    return redirect(url_for('login'))


@app.route('/profile/<name>')
@login_required
def profile():
    return render_template('profile.html', name=name)


@app.route('/admin')
@login_required
def admin():
    return render_template('admin.html')


@app.route('/genreport/<lid>/<id>')
def pdf_template():
    policy = Policy.query.get(request.form['userID'])
    letter = Letter.query.get(request.form['lid'])
    rendered = render_template_string(letter.template, policy=policy, letter=letter)
    pdf = pdfkit.from_string(rendered, False)

    response = make_response(pdf)
    response.headers['Content-Type'] = 'application/pdf'
    response.headers['Content-Disposition'] = 'inline; filename=output.pdf'

    return response

最佳答案

如果您使用参数化 url,则可以使用带参数的函数:

# url to call will be:
# genreport/1/2
@app.route('/genreport/<lid>/<userID>')
def pdf_template(lid, userID):
    print(lid, userID)
    # lid = request.form['lid']
    # userID = request.form['userID']

第二个选项使用url参数,你应该使用request.args.get:

# url to call will be:
# genreport?lid=1&userID=2
@app.route('/genreport')
def pdf_template():
    lid = request.args.get('lid')
    userID = request.args.get('userID')
    print(lid, userID)

关于python - 具有可变输入的 Flask url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47363492/

相关文章:

python - Pandas - 计算和旋转以获得前两年的收入

python - 如何提高 python 数据帧中平均计算的性能

python - 使用另一个 WS 作为验证 Flask/Rest/Mysql

python - 隐式访问SQLAlchemy类字段并修复 'object is not subscriptable'错误

python - 操作系统错误: [Errno 48] Address already in use

python - 从 IPython 运行 Flask 引发 SystemExit

python - Doc2Vec infer_vector 未按预期工作

python - 安装新模块时 OpenERP 服务器错误(Windows 7)

python - 寻找最低未使用号码的优雅和简短(pythonic)方式

python - Flask-登录重置 MongoDB 密码 - 查询不起作用