用来提供股票相关操作和信息
已经安装 anaconda
创建虚拟环境
conda create --name flask_stocks python=3.8 flask
|
使用 pycharm 创建项目,运行起来可以看到 hello world
构建程序结构
- 新建一个python package - “src”,用来放我们的程序,下面的操作都在src下面
- 把static和templates移到src下面
- 新建一个python package - “site”,用来放网页处理部分
- 新建一个python package - “api”,用来放api接口
- 新建一个python package - “admin”,用来放后台管理部分
- static下面建立目录-css/images/js,css和js下面建立目录ext用来放第三方的库
- 把static目录复制到src/admin, src/site下面
- 新建一个python package - “models”,用来放数据模型
- 在src,src/admin,src/site下面新建目录 - “templates”
src/templates用来放公共模板。各自蓝图下面的templates放各自的模板,
src/static也是用来放公共资源的,各自蓝图下面的static放各自使用的静态资源。
目录结构如下:
建立配置文件
import os from datetime import timedelta
basedir = os.path.abspath(os.path.dirname(__file__))
class Config: DEBUG = False TESTING = False SECRET_KEY = os.environ.get('SECRET_KEY') or 'AllthingsWORKtogherFORGoOd' UPLOAD_FOLDER = 'static/upload' 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 服务
增加蓝图路由
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
from flask import Blueprint
api = Blueprint('api', __name__)
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
|
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
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 出错页面
填写测试路由,注意这里需要访问 http://127.0.0.1:5000/site ,因为蓝图里面添加了前缀
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
|
打开调试选项