使用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
- 建立初步的项目结构,在pycharm新建项目时,选择上面建立的flaskStudyPy36虚拟环境
- 因为使用了anaconda所以虚拟环境路径是anaconda/envs/flaskStudyPy36/bin/python3.6
- 把自动生成的flaskTemplate.py改成run.py作为入口
修改run.py内容,这里稍微说一下最开始的coding设置,在有中文的情况下最好带上
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)
|
建立项目结构
- 新建一个python package - “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放各自使用的静态资源。
添加代码文件
修改src/site/__init__.py
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初始化的时候会无法发现数据模型,导致不会在数据库里面建表。
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自定义错误页面
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.html,src/site/templates/500.html
这里目前有404和500两个自定义错误页面
修改src/api/__init__.py
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文件
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文件
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
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='') 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文件,内容如下:
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config: DEBUG = False TESTING = False SECRET_KEY = os.environ.get('SECRET_KEY') or 'catsknowsSECRETkEY'
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
验证程序
右键点击run.py选择debug运行,应该可以看到index页面信息,
输入/api/v1.0/users,/admin应该可以看到返回的json数据
输入/aa应该可以看到404页面