接触Flask已经有大半年了,本篇博客主要来探讨如何规范化生产环境下Flask的项目目录结构。虽然目录结构见仁见智,个人有个人的看法和习惯,但总的来说,经过很多人的实践和总结,还是有很多共同的意见和想法的,而我在查看他人的目录结构结合自身在工作中的使用经验,总结了一个个人认为比较恰当的目录结构供参考。

   我推荐的目录结构:

  1. .
  2. ├── README.md
  3. ├── application
  4. ├── __init__.py
  5. ├── controllers
  6. └── __init__.py
  7. ├── forms
  8. └── __init__.py
  9. ├── models
  10. └── __init__.py
  11. ├── services
  12. └── __init__.py
  13. ├── static
  14. └── __init__.py
  15. ├── templates
  16. └── __init__.py
  17. └── utils
  18. └── __init__.py
  19. ├── config
  20. ├── __init__.py
  21. ├── default.py
  22. ├── development.py
  23. ├── development_sample.py
  24. ├── production.py
  25. ├── production_sample.py
  26. └── testing.py
  27. ├── deploy
  28. ├── flask_env.sh
  29. ├── gunicorn.conf
  30. ├── nginx.conf
  31. └── supervisor.conf
  32. ├── manage.py
  33. ├── pylintrc
  34. ├── requirements.txt
  35. ├── tests
  36. └── __init__.py
  37. └── wsgi.py

这里稍作介绍,首先是第一级目录的话,主要分为两类,一类是目录,另一类是运行相关的文件;其中目录有:

  • application:项目所有逻辑代码都放这
  • config:项目的配置文件,按不同环境各占一份
  • deploy:部署相关的文件,后续将使用到
  • tests:单元测试代码所在的目录

文件的话分别有:

  • manage.py:Flask-Script 运行文件,后面介绍
  • pylintrc:静态分析代码使用的 pylint 标准
  • requirements.txt:项目依赖库的列表
  • wsgi.py:wsgi 运行的文件

规范代码到指定目录

既然我们已经规定好了目录结构,是时候将我们的意面分到各个盘子里了。首先从文件开始,因为我们还没有介绍 Flask-Script,静态检查和 wsgi,所以就忽略这些文件,那么就剩下 requirements.txt 文件了。

  1. Flask==0.10.
  2. flask-mongoengine==0.7.
  3. Flask-Login==0.3.
  4. Flask-Admin==1.4.
  5. Flask-Redis==0.1.
  6. Flask-WTF==0.12

然后是时候解耦代码了,我们没有表单,暂时没有 services,没有静态文件也没有页面模板,所以可以这样合并:

  • 将 route 代码放到 application/controllers 中
  • 将 model 代码放到 application/models 中
  • 将初始化绑定 app 的代码放到 application/init.py 中
  • 将 数据库等配置放到 config/development.py 中

最后就是编写 manager.py 文件了。这里概要得列举几个重要的文件,更多的文件大家可以从 github 上 clone 代码出来阅读。

合并后的文件manager.py:

  1. # coding: utf-
  2. from flask.ext.script import Manager
  3. from application import create_app
  4.  
  5. # Used by app debug & livereload
  6. PORT =
  7.  
  8. app = create_app()
  9. manager = Manager(app)
  10.  
  11. @manager.command
  12. def run():
  13. """Run app."""
  14. app.run(port=PORT)
  15.  
  16. if __name__ == "__main__":
  17. manager.run()

application/init.py:

  1. # coding: utf-
  2. import sys
  3. import os
  4.  
  5. # Insert project root path to sys.path
  6. project_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
  7. if project_path not in sys.path:
  8. sys.path.insert(, project_path)
  9.  
  10. import logging
  11. from flask import Flask
  12. from flask_wtf.csrf import CsrfProtect
  13. from config import load_config
  14. from application.extensions import db, login_manager
  15. from application.models import User
  16. from application.controllers import user_bp
  17.  
  18. # convert python's encoding to utf8
  19. try:
  20. reload(sys)
  21. sys.setdefaultencoding('utf8')
  22. except (AttributeError, NameError):
  23. pass
  24.  
  25. def create_app():
  26. """Create Flask app."""
  27. config = load_config()
  28. print config
  29.  
  30. app = Flask(__name__)
  31. app.config.from_object(config)
  32.  
  33. if not hasattr(app, 'production'):
  34. app.production = not app.debug and not app.testing
  35.  
  36. # CSRF protect
  37. CsrfProtect(app)
  38.  
  39. if app.debug or app.testing:
  40. # Log errors to stderr in production mode
  41. app.logger.addHandler(logging.StreamHandler())
  42. app.logger.setLevel(logging.ERROR)
  43.  
  44. # Register components
  45. register_extensions(app)
  46. register_blueprint(app)
  47.  
  48. return app
  49.  
  50. def register_extensions(app):
  51. """Register models."""
  52. db.init_app(app)
  53. login_manager.init_app(app)
  54.  
  55. login_manager.login_view = 'login'
  56.  
  57. @login_manager.user_loader
  58. def load_user(user_id):
  59. return User.objects(id=user_id).first()
  60.  
  61. def register_blueprint(app):
  62. app.register_blueprint(user_bp)

application/controllers/init.py:

  1. #!/usr/bin/env python
  2. # encoding: utf-
  3. import json
  4.  
  5. from flask import Blueprint, request, jsonify
  6. from flask.ext.login import current_user, login_user, logout_user
  7.  
  8. from application.models import User
  9.  
  10. user_bp = Blueprint('user', __name__, url_prefix='')
  11.  
  12. @user_bp.route('/login', methods=['POST'])
  13. def login():
  14. info = json.loads(request.data)
  15. username = info.get('username', 'guest')
  16. password = info.get('password', '')
  17.  
  18. user = User.objects(name=username,
  19. password=password).first()
  20. if user:
  21. login_user(user)
  22. return jsonify(user.to_json())
  23. else:
  24. return jsonify({"status": ,
  25. "reason": "Username or Password Error"})
  26.  
  27. @user_bp.route('/logout', methods=['POST'])
  28. def logout():
  29. logout_user()
  30. return jsonify(**{'result': ,
  31. 'data': {'message': 'logout success'}})
  32.  
  33. @user_bp.route('/user_info', methods=['POST'])
  34. def user_info():
  35. if current_user.is_authenticated:
  36. resp = {"result": ,
  37. "data": current_user.to_json()}
  38. else:
  39. resp = {"result": ,
  40. "data": {"message": "user no login"}}
  41. return jsonify(**resp)

config/development.py:

  1. # coding: utf-
  2. import os
  3.  
  4. class DevelopmentConfig(object):
  5. """Base config class."""
  6. # Flask app config
  7. DEBUG = False
  8. TESTING = False
  9. SECRET_KEY = "sample_key"
  10.  
  11. # Root path of project
  12. PROJECT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
  13.  
  14. # Site domain
  15. SITE_TITLE = "twtf"
  16. SITE_DOMAIN = "http://localhost:8080"
  17.  
  18. # MongoEngine config
  19. MONGODB_SETTINGS = {
  20. 'db': 'the_way_to_flask',
  21. 'host': 'localhost',
  22. 'port':
  23. }

   如果你有更好的项目目录结构,欢迎交流!要特别说明下,这篇博客之前就记录在我的印象笔记上,我是直接搬过来的,所以格式方面就很难看了!这得感谢同事黄俊,之前是没有写博客的习惯的,都是直接记录在印象笔记上!哈哈

生产环境下Flask项目目录构建的更多相关文章

  1. Python开发【项目】:生产环境下实时统计网站访问日志信息

    日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...

  2. Python开发程序:生产环境下实时统计网站访问日志信息

    日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...

  3. Mysql迁移工具在生产环境下的使用

    在产品迭代开发发布过程中,由于业务需求的增加,数据库难免会有结构调整等操作. 在每个版本发布过程中怎么控制每个版本server端程序与数据库版本保持一致,以及数 据库升级.回滚等操作. 本博文宅鸟将向 ...

  4. [原]生产环境下的nginx.conf配置文件(多虚拟主机)

    [原]生产环境下的nginx.conf配置文件(多虚拟主机) 2013-12-27阅读110 评论0 我的生产环境下的nginx.conf配置文件,做了虚拟主机设置的,大家可以根据需求更改,下载即可在 ...

  5. 一次生产环境下MongoDB备份还原数据

    最近开发一个版本的功能当中用到了MongoDB分页,懒于造数据,于是就研究了下从生产环境上导出数据到本地来进行测试. 研究了一下,发现MongoDB的备份还原和MySQL语法还挺类似,下面请看详细介绍 ...

  6. 生产环境下lnmp的权限说明

    https://www.cnblogs.com/zrp2013/p/4183546.html 有关权限说明:-rwxrw-r‐-1 root root 1213 Feb 2 09:39 50.html ...

  7. 生产环境下,oracle不同用户间的数据迁移。第三部分

    任务名称:生产环境下schema ELON数据迁移至schema TIAN########################################前期准备:1:确认ELON用户下的对象状态se ...

  8. 总结:利用asp.net core日志进行生产环境下的错误排查(asp.net core version 2.2,用IIS做服务器)

    概述 调试asp.net core程序时,在输出窗口中,在输出来源选择“调试”或“xxx-ASP.NET Core Web服务器”时,可以看到类似“info:Microsoft.AspNetCore. ...

  9. Java生产环境下性能监控与调优详解视频教程 百度云 网盘

    集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...

随机推荐

  1. PCIE、UART、I2C、SMBUS、SPI、eSPI、USB、PS2、CAN、SDIO等数据传输协议

    M.2 wife一般支持USB.SDIO.PCIE三种传输

  2. React项目结构

    任何一种语言.框架,在真正上手的时候,多多少少会想想怎么安排项目结构(正所谓磨刀不误砍柴工),React也不例外. google了下,拿下面3篇博客来说道说道. (1) how-to-better-o ...

  3. Java中的class类的cast方法和asSubclass方法

    一般来说cast是转型的意思,但是学java的时间也不短了,class类居然还有cast这个方法,这里来学习一下这个cast有何用. 第一次看到这个cast是在Spring的源码中, spring-f ...

  4. asp.net core 初探 二

    今天用@宇内流云大大的jexus 体验一下生产环境的发布,运行. 生产环境: centos 7 jexus 5.8.1 独立版 包含了mono (mono安装真心痛苦……) 开发环境就是昨天的Ubun ...

  5. 使用git checkout 指定git代码库上的指定分支

    因为曾经一直是在用svn,到狼厂,大家都用Git. 哥的开发环境:IntelliJ 说说简单的操作过程吧. 1.检出Git代码库 cd到指定文件夹 git clone http://..../andr ...

  6. 开启kbmmw 5.09 中的XML-RPC和 JSON-RPC 服务

    kbmmw 5.09 里面增加了XML-RPC和 JSON-RPC 服务支持,但是默认没有开启. 需要在安装前,修改kbmMWConfig.inc文件. 加入以下定义 {$DEFINE KBMMW_J ...

  7. 【BZOJ3837】[Pa2013]Filary 随机化神题

    [BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时 ...

  8. 给js设定一个统一的入口

    javascript是种脚本语言,浏览器下载到哪儿就会运行到哪儿,这样的特性会为编程提供方便,但也easy使程序过于凌乱.支离破碎. js从功能上能够分为两大部分--框架部分和应用部分,框架部分提供的 ...

  9. xcode环境变量设置(转载)

    一般我们在xcode里面配置包含工程目录下头文件的时候,都要关联着相对路径和绝对路径,如果只是自己用这个项目,用绝对路径的问题不大,但是如果你把工程发给别人,别人就要在改这个绝对路径,这时候绝对路径的 ...

  10. js程序开发-3

    <h1>Date()类型</h1> 获取日期和时间 getDate() 获取日 1-31 getDay () 获取星期 0-6 getMonth () 获取月 0-11 get ...