【问题标题】:Flask template not loading烧瓶模板未加载
【发布时间】:2020-03-26 00:39:11
【问题描述】:

晚上好。我试图阻止用户使用 reCaptcha v3 进入我的网站。但是,执行此操作的模板没有加载,尽管被调用:

from flask import url_for, render_template, redirect, request, render_template_string
from flask import current_app as app
from .forms import *
from .filewriter import *
from .mailserver import *
from .rcvalidator import *
from flask_jsglue import JSGlue

jsglue = JSGlue(app)

@app.route('/', methods=('GET', 'POST'))
def home():
    reqform = ReqForm()
    delform = DelForm()
    error = 0
    if request.method == "POST":
        gtoken = request.json['gtoken']
        if not rc_form_valid(gtoken):
            print("working")
            return redirect(url_for('inv')) #would prefer to have the loaded thing here but as a test tried to lad a different function
    return render_template('home.html',
                           reqform=reqform,
                           delform=delform,
                           csrf_token=0,
                           errors=error)


@app.route('/req', methods=('GET', 'POST'))
def req():
    reqform = ReqForm()
    delform = DelForm()
    if reqform.validate_on_submit():
        appendfile("req.csv", reqform)
        mail(reqform.name.data, reqform.tel.data, "recipient")
        return redirect(url_for('success'))
    elif request.method == "POST" and not reqform.validate():
        error = 1 
    else:
        error = 0
    return render_template('home.html',
                           reqform=reqform,
                           delform=delform,
                           csrf_token=reqform.csrf_token,
                           errors = error)


@app.route('/delv', methods=('GET', 'POST'))
def delv():
    reqform = ReqForm()
    delform = DelForm()
    if delform.validate_on_submit():
        appendfile("del.csv", delform)
        mail(delform.name.data, delform.tel.data, "delivery")
        return redirect(url_for('success'))
    elif request.method == "POST" and not delform.validate():
        error = 2
    else:
        error = 0
    return render_template('home.html',
                           reqform=reqform,
                           delform=delform,
                           csrf_token=delform.csrf_token,
                           errors = error)


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

@app.route('/invalid', methods=(['GET']))
def inv():
    print("loaded inv") 
    return "get out now"

@app.route('/cancel', methods=('GET', 'POST'))
def cancel():
    canform = CanForm()
    if canform.validate_on_submit():
        # TODO: delete stuff from form
        return redirect(url_for('success'))
    elif request.method == "POST" and not delform.validate():
        error = 1
    else:
        error = 0
    return render_template('cancel.html',
                           canform=canform,
                           csrf_token=canform.csrf_token,
                           errors=error)

“working”和“loaded inv”打印,但是新模板没有渲染,我不明白为什么。当我提交表单时,success.html 会呈现。请帮忙

【问题讨论】:

  • 你重定向到'inv'并且路由是'/invalid'而不是'inv',错字吗?
  • @SlawomirDziuba 不,url_for 查找函数附带的 url(在本例中为 inv)

标签: python html python-3.x flask


【解决方案1】:

一个好的整体做法是知道“GET”和“POST”会做什么。

在您的代码中,我们知道 'POST' 在 home() 中做了什么,但不知道 'GET' 做了什么,所以试试这个:

@app.route('/', methods=('GET', 'POST'))
def home():
    reqform = ReqForm()
    delform = DelForm()
    error = 0
    if request.method == "POST":
        gtoken = request.json['gtoken']
        if not rc_form_valid(gtoken):
            print("working")
            return redirect(url_for('inv')) 
    elif request.method=='GET':
        return render_template('home.html',
                              reqform=reqform,
                              delform=delform,
                              csrf_token=0,
                              errors=error)

【讨论】:

  • 不,没有任何改变。仍然得到打印声明。我认为这可能与加载 home.html 和更改链接有关。如有必要,我可以发布更多代码。
  • inv() 你还需要返回 render_template('home.html') 如果这是正确的评论,我会更新我的答案。您需要它,因为在 home() 中,您将重定向到 url_for('inv') 并确保在提交表单时检查 url
  • 什么意思?将其重定向到 home.html (实际上是它本身)不是违背了目的吗?
  • 这取决于你如何构建它,但它不会渲染模板,除非你告诉它这样做。现在它唯一的回归“现在出去”。你基本上是重定向到“现在出去”
  • 是的,我想这样做。但是,当代码运行时,什么也没有发生。打印语句运行,页面继续为 home.html
猜你喜欢
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
相关资源
最近更新 更多