flask初始化一个项目

flask初始化一个项目
强烈推介IDEA2021.1.3破解激活,IntelliJ IDEA 注册码,2021.1.3IDEA 激活码  

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说flask初始化一个项目,希望能够帮助大家进步!!!

安装flask

pip install flask

项目目录

一个简单的目录结构,app目录下放置应用相关文件,server目录下放置关于配置的一些文件,使用的数据库是sqlite

- app
- 	__init__.py
- 	views.py  视图
- server
- 	__init__.py  falsk的项目入口信息
- 	configure.py  配置信息
- 	create_table.sql 创建表的sql文件
- run.py

configure.py

这个文件中总共分为4各类,Config父类里面是基础配置,下面的3个子类继承基础配置并根据自己的需求修改配置信息其中ProductionConfig、TestingConfig、DevelopmentConfig分别代表生产环境、测试环境、开发环境。

import os

from configuration.Configuration import Configuration


class Config(object):
    """默认配置"""
    DEBUG = False
    TESTING = False
    CON = Configuration()
    HOSTS = CON.HOSTS
    URL = CON.URL
    MAC = CON.MAC

class ProductionConfig(Config):
    """生产环境"""
    ENV = 'production'
    DATABASE_URI = ''
    SECRET_KEY = ''

class DevelopmentConfig(Config):
    """开发环境"""
    DEBUG = True
    ENV = 'development'
    SQLALCHEMY_ECHO = True
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    DATABASE = db_path = os.getcwd() + '/db.sqlite3'
    SECRET_KEY = 'dev'


class TestingConfig(Config):
    """测试环境"""
    TESTING = True

create.sql

该文件为sql命令文件,内容是user和post创建这两个表

CREATE TABLE user (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL
);

CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  author_id INTEGER NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  FOREIGN KEY (author_id) REFERENCES user (id)
);

database.py

数据库操作的初始化文件

import sqlite3

import click
from flask import current_app, g
from flask.cli import with_appcontext

def get_db():
    """ 获取与数据库的连接 g是一个特殊的对象,独立与每一个请求。它会在处理请求中把多个连接、多个函数所用到的数据存储其中, 反复使用,不需要每次调用该函数都要重新创建新的链接 """
    if 'db' not in g:
        g.db = sqlite3.connect(
            current_app.config['DATABASE'], # 数据库连接地址,从配置信息中读取
            detect_types=sqlite3.PARSE_DECLTYPES # 类型检测
        )
        g.db.row_factory = sqlite3.Row # 告诉连接返回类似于字典的行,这样可以通过列名称来操作数据。

    return g.db


def close_db(e=None):
    """ 通过检查g.db来确定连接是否已经建立。如果连接已建立,那么就关闭连接。 """
    db = g.pop('db', None)

    if db is not None:
        db.close()


def init_db():
    """数据库初始化,创建表"""
    db = get_db()
    with current_app.open_resource('create_table.sql') as f:
        db.executescript(f.read().decode('utf8'))

@click.command('init-db') # 添加新的命令
@with_appcontext
def init_db_command():
    """清除已经存在的表创建新的表"""
    init_db()
    click.echo('数据库初始化已完成')

def init_app(app):
    app.teardown_appcontext(close_db) # 告诉flask在返回响应后进行清理的时候调用此函数。
    app.cli.add_command(init_db_command) # 添加数据库表初始化命令

init.py

flask入口文件,配置flask项目信息

import os

from flask import Flask

def create_app(test_config=None):
    """ __name__是当前 Python 模块的名称,应用知道在哪里设置路径。 instance_relative_config=True相当与告诉应用配置文件相当与实例文件夹(instance folder)的相对地址,实例文件夹放置本地的配置文件 instance_path实例化目录所在地址 """
    app = Flask(__name__, instance_relative_config=True, instance_path=os.getcwd())

    # 测试开发配置分离
    if test_config is None:
        # 实例化这个类,读取这个类中的配置
        app.config.from_object('server.configure.DevelopmentConfig')
    else:
        app.config.from_object('server.configure.TestingConfig')

    # 注册数据库初始化
    from server.database import init_app
    init_app(app)

    # a simple page that says hello
    @app.route('/health')
    def health():
        return 'It is ok!'

    return app

run.py

项目执行文件,在项目根目录执行该文件运行项目

from server import create_app

if __name__ == '__main__':
   app = create_app()
   app.run(host="0.0.0.0", port=8080)

在命令行中执行 python run.py就可以直接运行项目,运行结果如下
在这里插入图片描述
如果要初始化数据库,命令

export FLASK_APP=run
flask init-db

运行结果如下,此时在项目的根目录会自动创建一个名字为db.sqlite3的数据库文件
在这里插入图片描述
参考官方文档

本文来源it小白求知路,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/29148

发表评论