导入 Flask 蓝图时修复循环导入

问题描述

我正在尝试将 Flask 蓝图导入到我的主文件中。但是,当我执行 from flask_first.login_user.login import login 时,我得到 cannot import name 'login' from partially initialized module 'flask_first.login_user.login' (most likely due to a circular import) (C:\Users\Max\PycharmProjects\python1\flask_first\login_user\login.py)。我该如何解决这个问题?

flask_first/login_user/login.py

from flask_first.main import *
from flask import Blueprint
from flask_first.main import users,db
from flask_sqlalchemy import sqlAlchemy
from datetime import timedelta

@login.route('/')
def login():
    error = None
    if request.method == 'POST':  # checking if the method is POST,it means we got a query from button
        if request.form['nm'] == 'admin' or request.form['ps'] == 'secret':
            flash("You were successfully logged in into the admin's user page")
            session.permanent = True
            session['user'] = request.form['nm']
            password = request.form['ps']
            password = session['password']
            return redirect(url_for('administrating'))
        else:  # if we are not admins,continue with this code
            flash(f"You were successfully logged in",category='success')
            session.permanent = True  # setting the bool of session to permanent
            session['user'] = request.form[
                'nm']  # we are just saying that the session['user']= the name,which we typed into the field
            user1 = session['user']  # user1 not a function
            session['password'] = request.form['ps']  # session['password']= field,in which we typed our password
            password1 = request.form['ps']

            found_user = users.query.filter_by(name=user1,password=password1).first()  # we are filtering all the users in the database by the name and password,we typed while logging in
            if found_user:  # if we have found this user,we say that the email he typed prevIoUsly is Now in the field of email
                session[
                    'email'] = found_user.email  # we are saying that the email user typed prevIoUsly,is Now the session['email']
            else:
                usr = users(user1,'',password1)  # if we haven't found that user by name and password,we create a new one
                db.session.add(usr)
                db.session.commit()
            return redirect(
                url_for('user'))  # redirecting to the user's page after logging in(using user's name)
    else:  # below is a standard script,which checks whether we are logged or not
        if 'user' in session:  # if user is already logged,it will download the user page.
            flash('You are already logged in,to log out,type logout')
            return redirect(url_for('user'))
        else:
            flash("You have not logged yet",category='success')
            return render_template('login_user.html',error=error)  # if it didn't go properly,we force the comeback
            # to the login_user page again

flask_first/main.py

from datetime import timedelta
from flask import Flask,redirect,url_for,render_template,request,session,flash
from flask_sqlalchemy import sqlAlchemy
from flask_first.admin.second import second
from flask_first.login_user.login import login

app = Flask(__name__)
app.secret_key = 'hello world'
app.register_blueprint(second,url_prefix='/test')
app.register_blueprint(login,url_prefix='login_user')
app.config['sqlALCHEMY_DATABASE_URI'] = 'sqlite:///users.sqlite3.html'  # access to the sql
app.config['sqlALCHEMY_TRACK_MODIFICATIONS'] = False
app.permanent_session_lifetime = timedelta(minutes=5)  # setting the time for long-lasting session
db = sqlAlchemy(app)

解决方法

正如错误所暗示的那样,您存在循环依赖问题。您正在从 login 导入 main,从 main 导入 login。模块无法做到这一点。

查看此 wiki 中的“问题”部分 https://en.m.wikipedia.org/wiki/Circular_dependency