安装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的数据库文件
参考官方文档