flask股票项目001-建立项目

用来提供股票相关操作和信息
已经安装 anaconda

创建虚拟环境

conda create --name flask_stocks python=3.8 flask

使用 pycharm 创建项目,运行起来可以看到 hello world

构建程序结构

  1. 新建一个python package - “src”,用来放我们的程序,下面的操作都在src下面
  2. 把static和templates移到src下面
  3. 新建一个python package - “site”,用来放网页处理部分
  4. 新建一个python package - “api”,用来放api接口
  5. 新建一个python package - “admin”,用来放后台管理部分
  6. static下面建立目录-css/images/js,css和js下面建立目录ext用来放第三方的库
  7. 把static目录复制到src/admin, src/site下面
  8. 新建一个python package - “models”,用来放数据模型
  9. 在src,src/admin,src/site下面新建目录 - “templates”

src/templates用来放公共模板。各自蓝图下面的templates放各自的模板,
src/static也是用来放公共资源的,各自蓝图下面的static放各自使用的静态资源。

目录结构如下:

20200603_211854.png

建立配置文件

# config.py
# coding:utf-8
import os
from datetime import timedelta

basedir = os.path.abspath(os.path.dirname(__file__))


class Config:
DEBUG = False
TESTING = False
# 登录设置 session cookie使用
SECRET_KEY = os.environ.get('SECRET_KEY') or 'AllthingsWORKtogherFORGoOd'
UPLOAD_FOLDER = 'static/upload'
# database config
# mysql+pymysql://name:password@localhost/db_name
SQLALCHEMY_DATABASE_URI = os.environ.get(
'DEV_DATABASE_URL') or 'mysql+pymysql://root:mysql@localhost:3306/books'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS = False
FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')

@staticmethod
def init_app(app):
pass


class DevelopmentConfig(Config):
DEBUG = True
send_file_max_age_default = timedelta(seconds=1)
use_reloader = True
TEMPLATES_AUTO_RELOAD = True
SQLALCHEMY_DATABASE_URI = os.environ.get(
'DEV_DATABASE_URL') or 'mysql+pymysql://root:mysql@localhost:3306/books'

class TestingConfig(Config):
TESTING = True


class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI = os.environ.get(
'DEV_DATABASE_URL') or 'mysql+pymysql://root:mysql@localhost:3306/books'


config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,

'default': DevelopmentConfig
}

建立应用

在 src/admin,src/site,下面建立 routes_site.py 做网站路由处理,routes_api.py 做各自的 api 服务
src/api 下面建立 routes_api.py 做公共 api 服务

增加蓝图路由

# src/admin/__init__.py
# coding:utf-8
from flask import Blueprint

admin = Blueprint('admin', __name__, template_folder='templates',static_folder='static',
static_url_path='/admin/static')

from . import routes_site, routes_api

# src/api/__init__.py
# coding:utf-8
from flask import Blueprint

api = Blueprint('api', __name__)

# src/site/__init__.py
# coding:utf-8
from flask import Blueprint

site = Blueprint('site', __name__, template_folder='templates', static_folder='static', static_url_path='/site/static')
site_api = Blueprint('site_api', __name__, template_folder='templates', static_folder='static',
static_url_path='/site/static')

# 末尾导入是为了避免循环导入依赖
from . import routes_site, routes_api
# src/__init__.py

# 使用工厂函数创建实例
from flask import Flask

from config import config


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


# 路由和自定义错误页面
from src.site import site
from src.api import api as api_blueprint
from src.admin import admin as admin_blueprint

# 访问时需要加上前缀
app.register_blueprint(site)
app.register_blueprint(api_blueprint, url_prefix='/api/v1.0')
app.register_blueprint(admin_blueprint, url_prefix='/admin')

return app

修改 app.py

# app.py

# coding:utf-8
import os

from src import create_app

app = create_app(os.getenv('FLASK_CONFIG') or 'default')

if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)

添加 404 和 500 出错页面

# src/templates/404.html
# src/templates/500.html

填写测试路由,注意这里需要访问 http://127.0.0.1:5000/site ,因为蓝图里面添加了前缀

# src/site/routes_site.py

from flask import render_template, app

from src.site import site


@site.route('/', methods=['GET'])
def index():
return 'Hello world site'


@site.app_errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404


@site.app_errorhandler(500)
def internal_server_error(e):
import traceback
traceback.print_exc()
errMsg = traceback.format_exc()
app.logger.exception('error 500: %s', errMsg)
return render_template('500.html'), 500

打开调试选项

20200603_220459.png