【问题标题】:Flask, Jinja2 and WTForms - one method for all URLs?Flask、Jinja2 和 WTForms - 所有 URL 的一种方法?
【发布时间】:2018-07-21 10:02:54
【问题描述】:

我正在使用 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')

【问题讨论】:

    标签: python web flask jinja2 flask-wtforms


    【解决方案1】:

    您可能已经尝试过,或者它实际上不是您要查找的内容,但是您的表单操作应该转到处理您的表单请求的单个路由,然后将它们重定向到任何地方。因此,无论您在哪里使用相同的表单操作,它都会使用相同的请求处理。代码将是这样的: html:

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

    蟒蛇:

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

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

    【讨论】:

    • 这就是我要找的!但是,因为我使用 WTForms 我必须在每个路由中声明该表单,但我认为在这种情况下我应该使用基本的 html 表单,并使用 Flask 的请求函数从该表单中获取数据。谢谢!
    【解决方案2】:

    您可以指定只需要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('/')
    

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多