如何使用Flask和会话管理解决此问题?

时间:2019-05-22 07:52:11

标签: python flask

与会话管理一起使用时,出现如下错误。

werkzeug.exceptions.BadRequestKeyError

werkzeug.exceptions.HTTPException.wrap.<locals>.newcls: 400 Bad Request: KeyError: 'Employee_Name'

Traceback (most recent call last)
File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)

File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 2295, in wsgi_app
response = self.handle_exception(e)

File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)

File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value

File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()

File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)

File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)

File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value

File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()

File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)

File "C:\Users\Lenovo\Desktop\intern\Employee_Management_system-master\app1.py", line 130, in admin_personaldetails
Employee_Name = userDetails['Employee_Name']

File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\lib\site-packages\werkzeug\datastructures.py", line 431, in __getitem__
raise exceptions.BadRequestKeyError(key)

werkzeug.exceptions.HTTPException.wrap.<locals>.newcls: 400 Bad Request: KeyError: 'Employee_Name'

HTML:

       <form action="details" method="POST">
         Employee_Name <input type="text" name="Employee_Name"/> 
         Employee_ID <input type="text" name="Employee_ID"/> 

         <input type="submit" name="SUBMIT" value="SUBMIT"/>     
        </form>

Python:

@app.route('/details', methods=['GET', 'POST'])
def admin_personaldetails():
    if request.method == 'POST' or 'GET':
       userDetails = request.form
       if 'Employee_ID' in session:  
          Employee_ID = session['Employee_ID']
       if Employee_ID=='Admin':
          userDetails=request.form
          Employee_Name = userDetails['Employee_Name']
          Employee_ID = userDetails['Employee_ID']
          cur = mysql.connection.cursor()
          cur.execute("INSERT INTO Employee(Employee_Name, Employee_ID)      VALUES(%s, %s)",(Employee_Name, Employee_ID))
          mysql.connection.commit()
          cur.close()
          return render_template('details.html', Details = Details)
      else:
          return "<h1>No Admin rights</h1>"
 return render_template('login.html')

2 个答案:

答案 0 :(得分:1)

如果方法是“发布”,则可以如下所示访问数据:

 private redirectToFirstPage() {
    const query = { page: this.currentPage.toString(), dataLakeStatus: '1', dataLakeStatus: '2' };
    this.$router.push({ query });
  }

如果方法是GET,则可以按以下方式访问数据:

request.form['Employee_Name']

所以您需要更换

request.args.get('Employee_Name', '')

通过

if request.method == 'POST' or 'GET':

编辑: 另外,在保存从发布请求中收到的数据后,您需要重定向用户,并在html和python文件中将Employee_Name替换为employee_name并将Employee_ID替换为employee_id。

您的代码将与此类似:

if request.method == 'POST':

编辑:读取数据的另一种方法:

@app.route('/details', methods=['GET', 'POST'])
def admin_personaldetails():
    if request.method == 'POST':
       userDetails = request.form
       if 'Employee_ID' in session:  
          Employee_ID = session['Employee_ID']
       else:
          Employee_ID = ""
       if Employee_ID=='Admin':
          userDetails=request.form
          Employee_Name = userDetails['employee_name']
          Employee_ID = userDetails['employee_id']
          cur = mysql.connection.cursor()
          cur.execute("INSERT INTO Employee(Employee_Name, Employee_ID)
  VALUES(%s, %s)",(Employee_Name, Employee_ID))
          mysql.connection.commit()
          cur.close()
          return redirect('/details?success=1')
      else:
          return redirect('/details?success=0')
 success = int(request.args.get('success', -100))
 if suucess == 0:
       return "<h1>No Admin rights</h1>"
 return render_template('details.html')

答案 1 :(得分:1)

request.form是一个不可更改的Multidict,因此您可以尝试使用to_dict()方法获取完整的数据。

代码:-

@app.route("/path", methods=["POST"])
def handle_post_request():
      if request.method == "POST": 
          data = request.form.to_dict()
          # ... do something with data ...
 return " Done"