Flask、Jinja2 和 WTForms - 一种适用于所有 URL 的方法?
Flask, Jinja2 and WTForms - one method for all URLs?
我正在用 Flask 构建一个简单的网站,用户登录表单在右上角可用,无论用户当前在哪个 url(html 表单定义在我的 base.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')
您可以指定仅需要 POST
请求的路由,并以 header:
的形式在 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('/')
您可能已经尝试过了,或者这实际上不是您要找的东西,但您的表单操作应该转到处理您的表单请求的单个路由,然后将它们重定向到任何地方。因此,无论您在哪里使用相同的表单操作,它都会使用相同的请求处理。代码将是这样的:
html:
<form action='login'>Form Here</form>
python:
@app.route('/login', methods=['POST'])
def login():
if request.method == "POST":
//handle form data
每次他们尝试登录时,无论他们在网站的哪个位置,都应该使用该代码。希望这对您有所帮助!
我正在用 Flask 构建一个简单的网站,用户登录表单在右上角可用,无论用户当前在哪个 url(html 表单定义在我的 base.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')
您可以指定仅需要 POST
请求的路由,并以 header:
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('/')
您可能已经尝试过了,或者这实际上不是您要找的东西,但您的表单操作应该转到处理您的表单请求的单个路由,然后将它们重定向到任何地方。因此,无论您在哪里使用相同的表单操作,它都会使用相同的请求处理。代码将是这样的: html:
<form action='login'>Form Here</form>
python:
@app.route('/login', methods=['POST'])
def login():
if request.method == "POST":
//handle form data
每次他们尝试登录时,无论他们在网站的哪个位置,都应该使用该代码。希望这对您有所帮助!