flask建站实践笔记001-基本结构

使用flask搭建一个网站。

这个是我学习flask的一个学习笔记。
这里使用pycharm和python3.6,系统环境是macOS 10.12,MySQL5.6.36

GitHub
优豆
YouTube

创建flask虚拟环境

conda create --name flaskStudyPy36 python=3.6
source activate flaskStudyPy36

安装flask,和相关扩展

pip install flask
数据库操作,这个是py3的库,配置及相关操作参考flask学习笔记-数据库相关
pip install PyMySQL
数据库ORM扩展包
pip install flask-sqlalchemy
数据库迁移扩展包
pip install flask-migrate
查看flask版本,顺便还能看到所在环境的python的版本
flask --version

使用pycharm新建一个flask项目flaskTemplate

  1. 建立初步的项目结构,在pycharm新建项目时,选择上面建立的flaskStudyPy36虚拟环境
  2. 因为使用了anaconda所以虚拟环境路径是anaconda/envs/flaskStudyPy36/bin/python3.6
  3. 把自动生成的flaskTemplate.py改成run.py作为入口
    修改run.py内容,这里稍微说一下最开始的coding设置,在有中文的情况下最好带上
# 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)

建立项目结构

  1. 新建一个python package - “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放各自使用的静态资源。

添加代码文件

修改src/site/__init__.py

# coding:utf-8
from flask import Blueprint

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

# 末尾导入是为了避免循环导入依赖
from . import routes, errors

新建Python文件src/site/routes.py 用来定义视图处理,这里要注意虽然还没用到User模型操作数据库,
但是这里要引用进来不然后面使用migrate初始化的时候会无法发现数据模型,导致不会在数据库里面建表。

# coding:utf-8
from flask import abort
from flask import render_template
from jinja2 import TemplateNotFound
from src.models.modelUser import User

from src.site import site


@site.route('/', methods=['GET'])
def base():
try:
return render_template("index.html")
except TemplateNotFound:
abort(404)

新建html文件src/site/templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Hi there!
</body>
</html>

新建Python文件src/site/errors.py自定义错误页面

# coding:utf-8
from flask import render_template, app

from src.site import 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

src/templates下面添加html文件src/site/templates/404.htmlsrc/site/templates/500.html
这里目前有404和500两个自定义错误页面

修改src/api/__init__.py

# coding:utf-8
from flask import Blueprint

api = Blueprint('api', __name__)

新建Python文件src/api/routes.py 用来定义视图处理

from src.api import api


@api.route('/users')
def getUsers():
return '{"result":"users info"}';

修改src/admin/__init__.py文件

# coding:utf-8
from flask import Blueprint

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

新建Python文件src/admin/routes.py 用来定义视图处理

from src.admin import admin


@admin.route('/')
def index():
return '{"result":"admin page"}';

修改src/__init__.py文件

# coding:utf-8
from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

from config import config

db = SQLAlchemy()
migrate = Migrate()


# 使用工厂函数创建实例
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)

db.init_app(app)
migrate.init_app(app, db)

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

app.register_blueprint(site)
app.register_blueprint(api, url_prefix='/api/v1.0')
app.register_blueprint(admin, url_prefix='/admin')

return app

新建数据模型文件src/models/modelUser.py

# coding:utf-8
from src import db


class User(db.Model):
__tablename__ = 't_users'
id = db.Column('f_id', db.Integer, primary_key=True, autoincrement=True)
# name = db.Column('f_userName', db.String(80), unique=True, nullable=False, server_default='', index=True)
name = db.Column('f_userName', db.String(80), unique=True, nullable=False, server_default='')
password = db.Column('f_password', db.String(80), nullable=False)
email = db.Column('f_email', db.String(80), unique=True, nullable=True, server_default='')

def __init__(self, name, password, email ):
self.name = name
self.password = password
self.email = email

def __repr__(self):
return '<User %r>' % self.name

run.py同级路径下新建config.py文件,内容如下:

# coding:utf-8
import os

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


class Config:
DEBUG = False
TESTING = False
# 登录设置 session cookie使用
SECRET_KEY = os.environ.get('SECRET_KEY') or 'catsknowsSECRETkEY'

# database config
# mysql+pymysql://name:password@localhost/db_name
SQLALCHEMY_DATABASE_URI = os.environ.get(
'DEV_DATABASE_URL') or 'mysql+pymysql://gisServer:adminGisServer@localhost:3306/flaskStudy'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS = False

@staticmethod
def init_app(app):
pass


class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = os.environ.get(
'DEV_DATABASE_URL') or 'mysql+pymysql://gisServer:adminGisServer@localhost:3306/flaskStudy'


class TestingConfig(Config):
TESTING = True


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


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

'default': DevelopmentConfig
}

注意这时还需要在 pycharm 里面配置一下才能 debug

20200407_203858.png 20200407_203923.png

验证程序

右键点击run.py选择debug运行,应该可以看到index页面信息,
输入/api/v1.0/users/admin应该可以看到返回的json数据
输入/aa应该可以看到404页面