创建视图时超出了runtimeerror最大递归深度

时间:2014-04-01 16:28:02

标签: flask wtforms flask-wtforms

我有这两个表单出现在一个页面上(dashboard.html

# Forms.py

class Area(Form):
    title = TextField("Title", [validators.Required("Please enter an Area Title")])
    text = TextAreaField("Text (max 50 characters)",[validators.Required("Please enter an Area text"),validators.Length(max=50,message="Area text cannot be more than 50 characters")])

class Message(Form):
    Message_title = TextField("Title", [validators.Required("Please enter a Message Title")])
    Message_Date_and_Time = DateTimeField("Date and Time")

我正在尝试创建3个视图来处理所有情况:

  • 当我最初到达页面时显示dashboard.html([GET])
  • 当用户发送Area表单时(因此根据验证获取验证或错误消息)([POST])
  • 当用户发送Message表单时(因此根据验证获取验证或错误消息)([POST])

为此,我有以下代码:

@app.route('/dashboard.html')
def dashboard():
    return render_template('dashboard.html',form= Area(),M_form = Message())

@app.route('/Area',methods=['POST'])
def Area():
    return render_template('dashboard.html', form= Area(), M_form=Message())

@app.route('/Message',methods=['POST'])
def Area():
    return render_template('dashboard.html', form= Area(), M_form=Message())

但是当我尝试加载这3个视图中的任何一个时,我收到RuntimeError: maximum recursion depth exceeded错误并且回溯是

return self.view_functions[rule.endpoint](**req.view_args)  
...., line 24, in dashboard  
return render_template('dashboard.html', form= Area(), M_form = Message())  
...., line 31, in Area  
return render_template('dashboard.html', form= Area(), N_form = Message())  
...., line 31, in Area  
return render_template('dashboard.html', form= Area(), N_form = Message())  

同样的错误一次又一次,直到达到时钟限制。

当我只使用信息中心视图时(在从代码中完全删除/Area/Message视图后),它的工作正常。我得到了dashboard.html

我一直在四处寻找,我找不到runtimeerror: maximum recursion和表格或WTforms之间的任何联系。它似乎总是与一个没有正确关闭的循环有关但在这里我没有循环。我看不出它的来源。

1 个答案:

答案 0 :(得分:1)

Area表单和视图函数(/Area/Message)具有相同的名称。您正在获取递归深度错误,因为在视图函数名称Area内,您再次调用Area()来生成表单,而是无限地在递归中回调视图函数。

@app.route('/Area',methods=['POST'])
def Area():
    # Area() is called below and it refers to this view function itself
    # that was just declared above.
    return render_template('dashboard.html', form= Area(), M_form=Message())

将视图函数的名称更改为不同且唯一的名称。