【问题标题】:Flask running request.method 'POST' by default instead of 'GET'Flask 运行 request.method 默认为 'POST' 而不是 'GET'
【发布时间】:2018-10-16 03:25:21
【问题描述】:

我正在开发这个 Flask 应用程序,我按下“登录”按钮并被重定向到“仪表板”。

这是我打开登录页面的默认路由的简化代码:

@app.route('/',  methods=['POST', 'GET'])
def home():
    if not session.get('logged_in'): 
        if request.method == 'GET':
            return render_template('login.html')
        elif request.method == 'POST':
            if # Username and Password are correct from the login form
                session['logged_in'] = True
                return dashboard()
            else:
                return render_template('login.html', message = "Wrong username or password")
    else:
        return render_template('dashboard.html')

login.html 有一个带有form action="/" method="POST" 的表单,它在上面的默认路由('/')中触发条件elif request.method == 'POST'

这里是 route('/dashboard') 的简化代码

@app.route('/dashboard', methods=['POST', 'GET'])
def dashboard():
    if session.get('logged_in'):
        if request.method == 'GET':
            return "it was GET"
        elif request.method == 'POST':
            return "it was POST"
    else:
        return render_template('login.html')

问题来了。仪表板路由在登录后运行 POST 方法,尽管(根据我的概念)它应该运行 GET 方法(因为 GET 是默认的)。

它给出的输出是“它是 POST”。请帮忙。谢谢:)

【问题讨论】:

    标签: python http post flask get


    【解决方案1】:

    你不能只打电话给return dashboard()。您必须启动重定向 - 告诉浏览器加载 /dashboard:

    return flask.redirect(flask.url_for('dashboard'))
    

    【讨论】:

    • 非常感谢。几个小时以来,我一直在用它敲打我的头。再次感谢!
    【解决方案2】:

    您需要更改应用程序的结构。考虑四个路由,而不是登录用户、显示登录页面、显示仪表板和提供用户验证的两条路由:1) 主路由,它显示带有 href 的 HTML 2) 登录路由,它接受用户输入,重定向到 3) 验证路由,它将用户提交到会话,以及 4) 用户从验证路由重定向的仪表板路由。最后,不要在每条路由的主体中进行用户验证,而是创建一个装饰器:

    home.html:

    <html>
      <body>
         <h1>Welcome to the application</h1>
         {%if not_validated%}
           <a href='/login'>Login</a>
         {%endif%}
      </body>
    </html>
    

    login.html:

    <html>
       <body> 
         <form action='/user_login' method='POST'>
            <input type='email' name='userEmail' placeholder='enter email'>
            <input type='password' name='userPassword' placeholder='password'>
           <button type='submit'>Login</button>
         </form>
       </body>
     </html>
    

    dashboard.html:

    <html>
      <body>
         <h1>Welcome, @{{username}}</h1>
      </body>
     </html>
    

    接下来,您需要创建路线。首先,创建一个包装器来验证用户:

    import functools
    import flask
    
    app = flask.Flask(__name__)
    
    
    def isloggedin(to_Login = False):
      def outer(f):
        @functools.wraps(f)
        def wrapper(*args):
          if (flask.session.get('loggedin', False) and not to_Login) or to_Login:
            return f(*args)
          return flask.redirect('/')
         return wrapper
      return outer
    
    
    @app.route('/', methods=['GET'])
    def home():
       flask.session['loggedin'] = False
       return flask.render_template('home.html', not_validated=flask.session.get('loggedin'))
    
    @app.route('/login', methods=['GET'])
    @isloggedin(to_Login = True)
    def login():
       return flask.render_template('login.html')
    
    @app.route('/user_login', methods=['POST'])
    def login_user():
      email = flask.request.form['userEmail']
      password = flask.request.form['userPassword']
      flask.session['email'] = email
      flask.session['password'] = password
      flask.session['loggedin'] = True
      flask.redirect('/dashboard')
    
    @app.route('/dashboard')
    @isloggedin()
    def dashboard():
      return flask.render_template('dashboard', username=flask.session['email'])
    

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 1970-01-01
      • 2016-09-09
      • 2021-05-20
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2015-04-21
      相关资源
      最近更新 更多