具有循环依赖的 Flask MVC(依赖注入?)

问题描述 投票:0回答:1

我正在尝试创建模型来在flask中形成mvc,但它被标记为循环依赖项(init中的db),我什至删除了要测试的模型并将它们放入控制器中以使用银行,但结果是同样,我可以做什么来在 user 中创建用户模型并使用 app > __init__.py 中定义的数据库而不需要循环依赖。

Github:https://github.com/HenriqueBuzin/resaber

__init__.py

import os
from flask import Flask
from flask_pymongo import PyMongo
from app.routes.site import site
from app.routes.admin import admin

app = Flask(__name__)

app.config["MONGO_URI"] = (f'mongodb://'
                           f'{os.environ["MONGO_USERNAME"]}'
                           f':{os.environ["MONGO_PASSWORD"]}'
                           f'@{os.environ["MONGO_HOSTNAME"]}:27017'
                           f'/{os.environ["MONGO_DATABASE"]}?authSource=admin')
mongodb_client = PyMongo(app)
db = mongodb_client.db

app.secret_key = os.urandom(32).hex()

app.template_folder = 'views'

app.register_blueprint(site)

app.register_blueprint(admin)

app.static_folder = 'static'

应用程序 > 控制器 > AdminController.py

from flask import render_template, redirect, url_for, request, session
from app import db

def get():

    user_count = db.users.count_documents({})

    if user_count == 0:
        return redirect(url_for('admin/config'))

    return render_template('admin/index.html')

def post():
    email = request.form['email']
    password = request.form['password']

    user = db.users.find_one({'email': email, 'password': password})

    if user:
        session['user_id'] = str(user['_id'])
        return redirect(url_for('admin_page'))

    return render_template('admin/index.html', error='Credenciais inválidas')

应用程序 > 路线 > admin.py

from flask import Blueprint
from app.controllers.admin import (AdminController, AdminPageController,
                                   ConfigAdminController,
                                   RegisterUserAdminController)

admin = Blueprint('admin', __name__, url_prefix='/admin')

@admin.route('/', methods=['GET'])
def admin_index_get():
    return AdminController.get()

@admin.route('/', methods=['POST'])
def admin_index_post():
    return AdminController.post()

@admin.route('/admin_page', methods=['GET'])
def admin_page():
    return AdminPageController.get()

@admin.route('/config', methods=['GET'])
def admin_config():
    return ConfigAdminController.get()

@admin.route('/cadastrar_usuario', methods=['GET'])
def admin_register_user():
    return RegisterUserAdminController.get()
python flask model-view-controller circular-dependency
1个回答
0
投票

我设法在具有 PyMongo() 的模型中创建一个 init

模型 > init

from flask_pymongo import PyMongo

mongo = PyMongo()

模型 > 用户

from app.models import mongo

class User:
    def __init__(self):
        self.mongo = mongo
        self.db = self.mongo.db
        self.collection = self.db.users
    
    def users_count(self):
        user_count = self.collection.count_documents({})
        return user_count

    def insert_user(self, email, password):
        result = self.collection.insert_one({"email": email, "password": password})
        
        if result.inserted_id:
            return str(result.inserted_id)
        else:
            return None
            
    def find_user_by_credentials(self, email, password):
        user = self.collection.find_one({"email": email, "password": password})
        if user:
            user['_id'] = str(user['_id'])
        return user

控制器 > 用户控制器

from flask import render_template, redirect, url_for, request, session
from app.models.user import User

def get():
    user_instance = User()
    user_count = user_instance.users_count()

    if user_count == 0:
        return redirect(url_for('admin.admin_config_get'))

    return render_template('admin/index.html')

def post():
    email = request.form['email']
    password = request.form['password']

    user_instance = User()

    # Chame o método find_user_by_credentials para verificar se o usuário existe
    existing_user = user_instance.find_user_by_credentials(email, password)

    if existing_user:
        session['user_id'] = existing_user['_id']
        return redirect(url_for('admin.admin_page'))

    return render_template('admin/index.html', error='Credenciais inválidas')

初始化

import os
from flask import Flask
from app.routes.site import site
from app.routes.admin import admin
from app.models import mongo
from app.seeders import Seeder

def create_app():

    app = Flask(__name__)

    app.secret_key = os.urandom(32).hex()

    app.template_folder = 'views'

    app.static_folder = 'static'

    app.config['UPLOAD_FOLDER'] = 'static/pdfs'

    app.register_blueprint(site)

    app.register_blueprint(admin)

    app.config["MONGO_URI"] = (f'mongodb://'
                           f'{os.environ["MONGO_USERNAME"]}'
                           f':{os.environ["MONGO_PASSWORD"]}'
                           f'@{os.environ["MONGO_HOSTNAME"]}:27017'
                           f'/{os.environ["MONGO_DATABASE"]}?authSource=admin')

    mongo.init_app(app)

    seeder = Seeder()
    
    seeder.seed_all_data()
    
    return app

app = create_app()

现在我要致力于提高安全性

© www.soinside.com 2019 - 2024. All rights reserved.