首页 > 解决方案 > 路由内部路由 - 在处理第一个请求后调用设置函数

问题描述

我正在尝试在另一条路线 ( info_form()) 内创建路线。有一段时间这是有效的。我不确定究竟是什么原因造成的,但我可能已经更改了一些代码,这就是导致它停止工作的原因。这是我的代码:

@app.route('/Register', methods=["GET", "POST"])
def register():
        FormErrMessage = 'Email already taken, or invalid email.'
        error = False
        if request.method == 'POST':
                    inp_email = request.form['email']
                    inp_password = request.form['password']

                    if User.objects(email=inp_email):
                        error = True
                    else:
                        @app.route('/Register/customer-form', methods=['GET', 'POST'])
                        def info_form():
                                msg = None
                                if request.method == 'POST':
                                    form = request.form

                                    inp_name = form['name']
                                    inp_lastName = form['lastName']
                                    inp_zipCode = form['zipCode']
                                    inp_address = form['address']
                                    inp_phoneNumber = form['phoneNumber']

                                    if User.objects(name=inp_name, lastName=inp_lastName):
                                        msg = '...'
                                    elif User.objects(phoneNumber=inp_phoneNumber):
                                            msg = '...'
                                    else:
                                        @app.route('/Register/customer-form/verify/<send>', methods=['GET', 'POST'])
                                        def verify_email(send):
                                                msg = None
                                                error_msg = None
                                                r = 8

                                                if send == 't':
                                                    ...

                                                if request.method == 'POST':
                                                    inp_code = request.form['code']

                                                    if int(inp_code) == r:
                                                        try:
                                                            User(
                                                                email=inp_email,
                                                                password=inp_password,
                                                                user_id=get_user_id(),
                                                                admin=False,
                                                                loggedIn=1,

                                                                # ip_addresses=ipAddress,
                                                                registered=False,
                                                                name=inp_name,
                                                                lastName=inp_lastName,
                                                                zipCode=inp_zipCode,
                                                                address=inp_address,
                                                                phoneNumber=inp_phoneNumber
                                                            ).save()

                                                            email(...)
                                                        except ValidationError as e:
                                                            print(e)
                                                            error_msg = '...'
                                                        else:
                                                            session['email'] = inp_email
                                                            session["password"] = inp_password
                                                            print(session)
                                                            return redirect('/')
                                                    else:
                                                        msg = 'Code invalid, try again.'

                                                return render_template('verify.html', email=inp_email, unk_err=error_msg,
                                                                       msg=msg)
                                        return redirect('/Register/customer-form/verify/t')
                                return render_template('customerform.html', msg=msg)
                        return redirect('/Register/customer-form')
        return render_template('register.html', FormErrMessage=FormErrMessage, error=error)

似乎正在提出这个问题,因为该请求已被处理。

Traceback (most recent call last):
  File "C:\Users\William\Nickels\venv\lib\site-packages\flask\app.py", line 2463, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\William\Nickels\venv\lib\site-packages\flask\app.py", line 2449, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\William\Nickels\venv\lib\site-packages\flask\app.py", line 1866, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\William\Nickels\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\William\Nickels\venv\lib\site-packages\flask\app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\William\Nickels\venv\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\William\Nickels\venv\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\William\Nickels\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\William\Nickels\venv\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\William\Nickels\venv\lib\site-packages\flask\app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\William\Nickels\app.py", line 55, in register
    @app.route('/Register/customer-form', methods=['GET', 'POST'])
  File "C:\Users\William\Nickels\venv\lib\site-packages\flask\app.py", line 1314, in decorator
    self.add_url_rule(rule, endpoint, f, **options)
  File "C:\Users\William\Nickels\venv\lib\site-packages\flask\app.py", line 90, in wrapper_func
    "A setup function was called after the "
AssertionError: A setup function was called after the first request was handled.  This usually indicates a bug in the application where a module was not imported and decorators or other functionality was called too late.
To fix this make sure to import all your view modules, database models and everything related at a central place before the application starts serving requests.

有人可以告诉我如何解决这个问题或解决它。谢谢。我不明白这一点:

import all your view modules, database models and everything related at a central place before the application starts serving requests.

标签: pythonflask

解决方案


该错误试图说明的是,在 Flask 应用程序开始运行后,您无法进行设置(例如添加路由)。

您有一个更深层次的问题,即假设嵌套路由函数将保留来自封闭路由的数据的可见性。例如,该/Register/customer-form路线将有权访问inf_email封闭/Register路线中的集合。这里的机制不是那样工作的。

由于意图是从注册工作流的一个步骤到下一个步骤中保留信息,因此常见的机制是将来自一个路由的状态作为隐藏的表单元素注入,以便将它们带到下一个路由。在这里,这意味着通过inf_email等。扩展为“customerform.html”模板(与“verify.html”模板类似)。


推荐阅读