python - 组织 Flask 项目

标签 python flask

这是我第一次使用 python 和 Flask 创建项目。我也打算使用 SQLAlchemy 模型。这是一个相当大的项目。截至目前,我已将项目分为 2 个蓝图:站点和 api。组织完项目后,我很困惑如何将这些模型与数据库连接起来,以及我是否需要重新组织结构,因为我不完全了解 Flask 的性质。

这是我的基础存储库中 dir app/ 的目录结构:

`

.
├── Blueprints
│   ├── __init__.py
│   ├── __pycache__
│   │   └── __init__.cpython-36.pyc
│   ├── api
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   └── routes.cpython-36.pyc
│   │   └── routes.py
│   ├── config.py
│   └── site
│       ├── __init__.py
│       ├── __pycache__
│       │   ├── __init__.cpython-36.pyc
│       │   └── routes.cpython-36.pyc
│       ├── operations.py
│       ├── routes.py
│       ├── static
│       └── templates
│           ├── about.html
│           ├── contact.html
│           ├── home.html
│           ├── login.html
│           ├── services.html
│           └── stories.html
├── __main__.py
├── __pycache__
│   └── __main__.cpython-36.pyc
└── models
    ├── Attendance.py
    ├── Batch.py
    ├── Course.py
    ├── Module.py
    ├── Student.py
    ├── Test.py
    └── __init__.py

`

请忽略 Pycache,因为这是自动生成的。

现在我无法弄清楚如何在 api 和站点中导入和使用这些模型,我也无法理解如何获取在 /Blueprints/__init__.py 中创建的数据库对象 到所有模型。

我知道这个问题不符合堆栈溢出问题的标准,但我个人觉得组织一个flask项目本身就很令人困惑,我看到的每个教程或论坛都有自己的组织角度。

最佳答案

组织项目的方法有多种,但 app/文件夹中包含的 __init__.py 文件是将许多项目链接在一起的。以下是我的项目的 __init__.py 文件之一的内容:

from werkzeug.contrib.fixers import ProxyFix
from flask import Flask, session
from app.config import (PERMANENT_SESSION_LIFETIME_MS, Time_Before_Warning,
                        Min_Ping_Interval)
import datetime

app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)

# Setup the app with the config.py file
app.config.from_pyfile('config.py')

# Setup the logger
from app.logger_setup import logger, log_view

# Setup the database
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

#setup zipcode database
from pyzipcode import ZipCodeDatabase
zdb = ZipCodeDatabase()

# Setup the mail server
from flask.ext.mail import Mail
mail = Mail(app)

# Setup the debug toolbar
#from flask_debugtoolbar import DebugToolbarExtension
#app.config['DEBUG_TB_TEMPLATE_EDITOR_ENABLED'] = False
#app.config['DEBUG_TB_PROFILER_ENABLED'] = False
#toolbar = DebugToolbarExtension(app)

# Setup the password crypting
from flask.ext.bcrypt import Bcrypt
bcrypt = Bcrypt(app)

# Import the views
from app.views import (main, user, error, request, upload, dashboard, org,
                        msgs, notifications, download, reports,
                        direct_send,provider,utils)
app.register_blueprint(user.userbp)
app.register_blueprint(request.requestbp)
app.register_blueprint(upload.uploadbp)
app.register_blueprint(dashboard.dashboardbp)
app.register_blueprint(org.orgbp)
app.register_blueprint(msgs.msgbp)
app.register_blueprint(notifications.notificationsbp)
app.register_blueprint(download.downloadbp)
app.register_blueprint(reports.reportsbp)
app.register_blueprint(direct_send.directsendbp)
app.register_blueprint(provider.providerbp)
app.register_blueprint(utils.utilsbp)

# Setup the user login process
from flask.ext.login import LoginManager, current_user
from app.models import User, View

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'userbp.signin'


@login_manager.user_loader
def load_user(email):
    return User.query.filter(User.email == email).first()

from flask.ext.principal import identity_loaded, RoleNeed, UserNeed
@identity_loaded.connect_via(app)
def on_identity_loaded(sender, identity):

    # Set the identity user object
    identity.user = current_user

    # Add the UserNeed to the identity
    if hasattr(current_user, 'id'):
        identity.provides.add(UserNeed(current_user.id))

    # Assuming the User model has a list of roles, update the
    # identity with the roles that the user provides
    if hasattr(current_user, 'roles'):
        identity.provides.add(RoleNeed(current_user.roles.type))

from flask.ext.principal import Principal

# load the extension
principals = Principal(app)

# Create a permission with a single Need, in this case a RoleNeed.

#from app import admin

@app.before_request
def make_session_permanent():
    session.permanent = True
    lt = PERMANENT_SESSION_LIFETIME_MS / (60*1000)
    app.permanent_session_lifetime = datetime.timedelta(minutes=lt)

@app.context_processor
def add_session_config():
    """
    Add current_app.permanent_session_lifetime converted to milliseconds
    to context.
    """
    return {
        'PERMANENT_SESSION_LIFETIME_MS': PERMANENT_SESSION_LIFETIME_MS,
        'Time_Before_Warning': Time_Before_Warning,
        'Min_Ping_Interval': Min_Ping_Interval,
    }

然后在其中一张蓝图中:

from flask import (Blueprint, render_template, redirect, url_for,
                   abort, flash, request)
from flask.ext.login import login_required, current_user
from app import app, models, db, log_view, config
from app.models import (Groups, Organizations, OrgHasOwner, UserHasGroups,
                        GroupHasOwner, User, Fax, FavoriteGroups)
from app.forms import org as org_forms
from app.toolbox import email, misc, s3, fax
from sqlalchemy.sql import func
from werkzeug import secure_filename
from uuid import uuid4
import datetime
import string
import os

# Create a user blueprint
orgbp = Blueprint('orgbp', __name__, url_prefix='/org')

@orgbp.route('/invite_user', methods=['GET','POST'])
@login_required
def invite_user():
    [stuff goes here]

关于python - 组织 Flask 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49475945/

相关文章:

python - 当我将两位艺术家叠加在同一位置时,最低的一位仍然以某种方式显示

python代码理解

python - Flask 中的猜数字游戏

python - docker容器上无法访问flask-restplus微服务

python - Gunicorn 无法终止外部进程

python - Homebrew ,python安装

python - pip 安装 hunspell : Cannot open include file: 'hunspell.h' : No such file or directory

python - 忽略索引的两个数据帧的快速减法(Python)

python - 使用 ajax 间歇性出现 Flask-Login 问题

javascript - Flask webservice 的 HighCharts 查询参数问题