Flask,Jinja2和WTForms-所有URL的一种方法?

时间:2018-07-21 10:02:55

标签: python web flask jinja2 flask-wtforms

我正在用Flask构建一个简单的网站,无论用户当前使用哪个url,都可以在右上角找到用户登录表单(在我的base.html模板中定义了html表单,该表单通过所有其他模板)。因此,使其工作的一种选择是在每个@ app.route()方法中处理登录表单,但是它添加了很多冗余代码,看起来很丑陋,我正在寻找一种简化它的方法。 。

所以我的问题是:是否可以创建一个方法来处理应用程序中每个端点的登录表单?

这是我的登录表单的一些代码:

@app.route('/', methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
    return redirect(url_for('home'))

form = LoginForm()
if form.validate_on_submit():
    user = User.query.filter_by(username=form.username.data).first()

    if user is None or not user.check_password(form.password.data):
        flash('Invalid username or password')
        return redirect(url_for('login'))

    login_user(user, remember=True)
    return redirect(url_for('home'))

return render_template('index.html', form=form)

这是呈现的表单本身的屏幕截图:

https://i.stack.imgur.com/PXNSB.png

编辑:

到目前为止,我仅想到了这一点,但是还有更好的解决方案吗? (端点参数是将用户重定向回他登录的页面)

# method used in each URL for login purpose
def login_function(form, endpoint):
user = User.query.filter_by(username=form.username.data).first()

if user is None or not user.check_password(form.password.data):
    flash('Invalid username or password')
    return redirect(url_for(endpoint))

login_user(user, remember=True)
return redirect(url_for(endpoint))

在每个URL中都可以这样访问该方法:

login_form = LoginForm()
if login_form.validate_on_submit():
    return login_function(login_form, 'home')

2 个答案:

答案 0 :(得分:0)

您可以指定仅需要POST请求的路由,并在表单标题的action参数中指定该路由:

form = """
  <form action='/form_post_route' method=['POST']>
     <input type='text' name='some_val'>
     <input type='submit'>Submit</input>
  </form>
"""
@app.route('/', methods=['GET'])
def home():
  return f'{form}\n<h1>Welcome</h1>'
@app.route('/some_other_route', methods=['GET'])
def other_route():
  return f'{form}\n<h1>Some data here</h1>'
@app.route('/last_route', methods=['GET'])
def last_route():
  return f'{form}\n<h1>Other data here</h1>'
@app.route('/form_post_route', methods=['POST'])
def get_user_data():
   param = flask.request.form['some_val']
   return flask.redirect('/')

答案 1 :(得分:0)

您可能已经尝试过此操作,或者它实际上并不是您想要的,但是您的表单操作应转到处理您的表单请求的单个路由,然后将其重定向到任何地方。因此,无论您在何处使用相同的表单操作,它都将使用相同的请求处理。代码如下: html:

<form action='login'>Form Here</form>

python:

@app.route('/login', methods=['POST'])
def login():
    if request.method == "POST":
        //handle form data

他们每次尝试登录时,无论他们在网站上的什么位置,都应使用该代码。希望这会有所帮助!