【简说Python WEB】Flask应用的文件结构

简介:

【简说Python WEB】Flask应用的文件结构

目录
【简说Python WEB】Flask应用的文件结构
1.文件结构的目录
2.配置程序--config.py
3.app应用包
4.剥离出来的email.py
5.蓝本(BLueprint)的应用
6.main目录的error.py代码剥离:

  1. main目录的view.py代码剥离:
    8.主脚本

9.需要安装的依赖包
10.应用启动
附录
系统环境:Ubuntu 18.04.1 LTS

Python使用的是虚拟环境:virutalenv

Python的版本:Python 3.6.9

【简说Python WEB】Flask应用的文件结构
之前,我们应用了如下的组件:

flask-wtf
Flask-SQLAlchemy
Flask-Moment
Jinja2模板
Bootstrap
flask-mail
flask_migrate
因为之前调试和应用组件,插件,导致app.py有一定的体量。对于大多数web应用来说,如果把代码都堆在以前,难以维护。而有一个不错的文件目录组织。可以很好的维护整个项目。通过自我学习,提炼出自己一套容易维护的文件结构。把之前的可以剥离出来的公用模块进行一个分离操作。

1.文件结构的目录
Zflask/
├── app
│   ├── email.py
│   ├── __init__.py
│   ├── main
│   │   ├── errors.py
│   │   ├── forms.py
│   │   ├── __init__.py
│   │   └── views.py
│   ├── models.py
│   └── templates
│   ├── 404.html
│   ├── 500.html
│   ├── base.html
│   ├── index.html
│   └── mail
│   ├── new_user.html
│   └── new_user.txt
├── config.py
├── LICENSE
├── README.md
├── requirements.txt
└── zsdblog.py
app/email.py从原来app.py剥离出来的邮件功能
app/models.py把之前的users模型和roles模型,剥离出来.
app/__init__.py 一些初始化的通用脚本放在这里面,工厂函数
config.py配置文件
zsdblog.py主驱动应用,用于驱动整个项目
requirements.txt依赖包
main/errors.py剥离出来的自定义错误处理程序(剥离原来的程序)
main/forms.py表单处理程序(剥离原来的程序)
main/views.py自定义的应用路由程序(剥离原来的程序)
main/__init__.py 蓝本程序
2.配置程序--config.py
import os

class Config:

SQLALCHEMY_TRACK_MODIFICATIONS = False

SECRET_KEY = 'wojiubugaosuni'
MAIL_SERVER = 'smtp.qq.com'
MAIL_PORT = 587
MAIL_USE_TLS = True
MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')

ZSD_MAIL_SUBJECT_PREFIX = '[ZSD博客]'
ZSD_MAIL_SENDER = 'ZSD博客 管理员 <543421410@qq.com>'
ZSD_ADMIN = os.environ.get('ZSD_ADMIN')

@staticmethod
def init_app(app):
    pass

class DevelopmentConfig(Config):

    DEBUG=True
    HOSTNAME = '172.30.200.252'
    DATABASE = 'zsd'
    USERNAME = 'zsd'
    PASSWORD = 'zsd'
    DB_URI = 'mysql+pymysql://{}:{}@{}:3306/{}?charset=utf8mb4'.format(
             USERNAME, PASSWORD, HOSTNAME, DATABASE)
    SQLALCHEMY_DATABASE_URI = DB_URI

class TestingConfig(Config):

    TESTING = True

class ProductionConfig(Config):

PROD = True        

config = {

'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,

'default': DevelopmentConfig

}
把之前的URI驱动,MAIL配置,封装起来。通过不同的应用环境,调用不同的配置。

3.app应用包
数据库模型app/email.py和电子邮件函数程序app/models.py都移动至app包内。

延迟构建应用实例,把创建过程移动到可以显示调用的工厂函数中

app/__init__.py 代码

from flask import Flask
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_moment import Moment
from flask_sqlalchemy import SQLAlchemy
from config import config

bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()

def create_app(config_name):

app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)

bootstrap.init_app(app)
mail.init_app(app)
moment.init_app(app)
db.init_app(app)

from .main import main as main_blueprint
app.register_blueprint(main_blueprint)

return app

整个代码中,可以看到引入了许多Flask的扩展。因为还没有初始化所需要的应用实例,这些构建类也没有真正的初始化,只是放在了那里。

必须有一个应用,通过调用create_app函数,才算初始化了。

4.剥离出来的email.py
修改的代码如下:

def send_email(to, subject, template, **kwargs):

app = current_app._get_current_object()
msg = Message(app.config['ZSD_MAIL_SUBJECT_PREFIX'] + ' ' + subject,
              sender=app.config['ZSD_MAIL_SENDER'], recipients=[to])
msg.body = render_template(template + '.txt', **kwargs)
msg.html = render_template(template + '.html', **kwargs)
thr = Thread(target=send_async_email, args=[app, msg])
thr.start()
return thr

其中添加了一句app = current_app._get_current_object()调用的是current_app而不是原来的app

5.蓝本(BLueprint)的应用
蓝本(BLueprint)实现应用的模块化,可以定义路由和错误处理程序,使得应用层次更清晰。

其中,蓝本中定义的路由和错误处理程序是处在sleep状态。只有蓝本注册到应用上面了,它们才成为应用的一部分。这种插槽式的应用构建,非常灵活。

main/__init__.py 创建蓝本
from flask import Blueprint

main = Blueprint('main', __name__)

from . import views, errors
然后在app/init.py程序中,把蓝本在工厂函数create_app()中注册到应用上。

app/__init__.py 蓝本注册

..

from .main import main as main_blueprint
app.register_blueprint(main_blueprint)

return app
6.main目录的error.py代码剥离:
from flask import render_template
from . import main

@main.app_errorhandler(404)
def page_not_found(e):

return render_template('404.html'), 404

@main.app_errorhandler(500)
def internal_server_error(e):

return render_template('500.html'), 500

其中errorhandler被换成了app_errorhandler, 相当于全局的错误处理程序。

  1. main目录的view.py代码剥离:
  2. flask import render_template, session, redirect, url_for, current_app

from .. import db
from ..models import User
from ..email import send_email
from . import main
from .forms import NameForm

@main.route('/', methods=['GET', 'POST'])
def index():

form = NameForm()
if form.validate_on_submit():
    user = User.query.filter_by(username=form.name.data).first()
    if user is None:
        user = User(username=form.name.data)
        db.session.add(user)
        db.session.commit()
        session['known'] = False
        if current_app.config['FLASKY_ADMIN']:
            send_email(current_app.config['FLASKY_ADMIN'], 'New User',
                       'mail/new_user', user=user)
    else:
        session['known'] = True
    session['name'] = form.name.data
    return redirect(url_for('.index'))
return render_template('index.html',
                       form=form, name=session.get('name'),
                       known=session.get('known', False))

其中current_app 替换了原来的app

        if current_app.config['FLASKY_ADMIN']:
            send_email(current_app.config['FLASKY_ADMIN'], 'New User',
                       'mail/new_user', user=user)

url_for('index')需要换成url_for('main.index')main代表这个蓝本下的index路由跳转。

路由装饰器由蓝本提供,所以需要改成:@main.route

8.主脚本
zsdblog.py代码如下:

import os
from flask_migrate import Migrate
from app import create_app, db
from app.models import User, Role

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
migrate = Migrate(app, db)

@app.shell_context_processor
def make_shell_context():

return dict(db=db, User=User, Role=Role)

上述脚本,创建一个应用实例,环境变量FLASK_CONFIG可以定义,如果不定义。做默认配置。

这次,可以开启DEBUG模式,如下:

设置环境变量:

(zsdpy1) $ export FLASK_APP=zsdblog.py
(zsdpy1) $ export FLASK_DEBUG=1
9.需要安装的依赖包
(zsdpy1) $ pip freeze >>requirements.txt
10.应用启动
(zsdpy1) $ flask run -h '0.0.0.0' -p 9000
当然如果有db模型更新的话,可以使用

flask db upgrade
更新到最新的模型DDL语。

应用效果如下:

附录
执行代码的时候,出现了如下错误 :

werkzeug.routing.BuildError

werkzeug.routing.BuildError: Could not build url for endpoint 'index'. Did you mean 'main.index' instead?

File "/home/zsd/Zflask/app/main/views.py", line 24, in index

return redirect(url_for('index'))
可以看到/home/zsd/Zflask/app/main/views.py24行代码有问题,修改为如下 :

return redirect(url_for('main.index'))
原文地址https://www.cnblogs.com/zhangshengdong/p/12560353.html

相关文章
|
18天前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
32 3
|
6天前
|
缓存 安全 网络安全
HTTP/2与HTTPS在Web加速中的应用
HTTP/2与HTTPS在Web加速中的应用
|
9天前
|
SQL 安全 前端开发
PHP与现代Web开发:构建高效的网络应用
【10月更文挑战第37天】在数字化时代,PHP作为一门强大的服务器端脚本语言,持续影响着Web开发的面貌。本文将深入探讨PHP在现代Web开发中的角色,包括其核心优势、面临的挑战以及如何利用PHP构建高效、安全的网络应用。通过具体代码示例和最佳实践的分享,旨在为开发者提供实用指南,帮助他们在不断变化的技术环境中保持竞争力。
|
8天前
|
算法 定位技术 Python
震惊!Python 图结构竟然可以这样玩?DFS&BFS 遍历技巧大公开
在 Python 编程中,图是一种重要的数据结构,而深度优先搜索(DFS)和广度优先搜索(BFS)是遍历图的两种关键算法。本文将通过定义图的数据结构、实现 DFS 和 BFS 算法,并通过具体示例展示其应用,帮助读者深入理解这两种算法。DFS 适用于寻找路径和检查图连通性,而 BFS 适用于寻找最短路径。掌握这些技巧,可以更高效地解决与图相关的复杂问题。
21 2
|
11天前
|
开发框架 前端开发 JavaScript
利用Python和Flask构建轻量级Web应用的实战指南
利用Python和Flask构建轻量级Web应用的实战指南
39 2
|
13天前
|
Python
SciPy 教程 之 SciPy 图结构 7
《SciPy 教程 之 SciPy 图结构 7》介绍了 SciPy 中处理图结构的方法。图是由节点和边组成的集合,用于表示对象及其之间的关系。scipy.sparse.csgraph 模块提供了多种图处理功能,如 `breadth_first_order()` 方法可按广度优先顺序遍历图。示例代码展示了如何使用该方法从给定的邻接矩阵中获取广度优先遍历的顺序。
24 2
|
14天前
|
算法 Python
SciPy 教程 之 SciPy 图结构 5
SciPy 图结构教程,介绍图的基本概念和SciPy中处理图结构的模块scipy.sparse.csgraph。重点讲解贝尔曼-福特算法,用于求解任意两点间最短路径,支持有向图和负权边。通过示例演示如何使用bellman_ford()方法计算最短路径。
26 3
|
14天前
|
API 数据库 开发者
深度剖析Django/Flask:解锁Web开发新姿势,让创意无限延伸!
在Web开发领域,Django与Flask如同两颗璀璨的星辰,各具特色。Django提供全栈解决方案,适合快速开发复杂应用;Flask则轻量灵活,适合小型项目和API开发。本文通过问答形式,深入解析两大框架的使用方法和选择策略,助你解锁Web开发新技能。
31 2
|
19天前
|
前端开发 安全 应用服务中间件
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第26天】随着互联网的快速发展,前端性能调优成为开发者的重要任务。本文探讨了HTTP/2与HTTPS在前端性能优化中的应用,介绍了二进制分帧、多路复用和服务器推送等特性,并通过Nginx配置示例展示了如何启用HTTP/2和HTTPS,以提升Web应用的性能和安全性。
17 3
|
10天前
|
数据库 Python
从零开始构建你的第一个Flask Web应
从零开始构建你的第一个Flask Web应