如果用户输入错误数据,则重定向到同一页面并显示一条消息

Redirect to the same page and display a message if user insert wrong data

我正在构建一个带有聊天室的网络聊天应用程序。 我有一个页面,用户可以在其中打开一个新房间,页面内有一个表格。 如果用户提交的房间已经存在,我想向他显示一条消息。


例如: 456 房间已经存在,用户试图打开 456 房间。 所以我想弹出一个消息说房间已经存在


服务器端

    @app.route('/NewRoom')
def newRm():
    return render_template('NewRoom.html')

@app.route('/chat',methods=['GET','POST'])
def CreateRm():
    if(request.method=='POST'):
        username = request.form['username'].lower() 
        room = request.form['room'].lower()
        ExistRoom = DBManage.ExistRoom(room)
        error = "YOU ENTERED ROOM THAT ALREADY EXISTS"
        if not ExistRoom:
            limit = request.form['limit']
            if limit == '':
                limit = 'UNLIMITED'
            session['limit'] = limit 
            image = request.files['getFile']
            newImgs = open("static/images/" + username + ".jpg","wb")
            newImgs.write(image.read())
            newImgs.close()
            room = room[:5].strip()
            DBManage.newRoom(room,limit)
            DBManage.newPerson(username,room)
            #sDBManage.RoomUsers(room)
            #Store the data in session
            session['username'] = username
            session['room'] = room
            return render_template('chat.html', session = session)
        else:
            flash(error)
            return redirect(url_for('newRm',error=error))

在 CreateRm 函数中,最后的 else 对我来说效果不佳,它刷新页面但不发送错误消息,真的不知道如何解决。


客户端

{% if error %}
   <p class=error><strong>Error:</strong> {{ error }}
{% endif %}

谢谢大家

问题是您正在将重定向返回到另一条路线,并试图将变量传递给该路线中的模板。一种方法是简单地 re-rendering 模板,同时将变量 error 传递给它。尝试替换:

return redirect(url_for('newRm',error=error))

return render_template('NewRoom.html', error=error)

另一种选择是将您的 newRm 路由配置为接受 optional arguments。这可能看起来像这样:

@app.route('/NewRoom', defaults={'error':''})
@app.route('/Newroom/<error>')
def newRm():
    return render_template('NewRoom.html')

然后您将错误传递给此路由,就像您一直在做的那样。

return redirect(url_for('newRm', error=error))

要完全解决您的问题,您还必须在 if(request.method=='POST'): 之外添加一个 return 语句以捕获任何 GET 请求。可能是这样的:

return render_template('NewRoom.html')