初始flask

Flask框架介绍与环境搭建

初始flask

  • django是大而全,提供所有常用的功能

  • flask是小而精,只提供核心功能

  Flask诞生于2010年, 使用python语言基于Werkzeug工具箱编写的轻量级Web开发框架
  Flask本身相当于一个内核, 其他几乎所有的功能都要用到扩展(邮件:Flask-Mail, 用户认证:Flask-Login, 数据库:Flask-SQLAlchemy).
  Flask的核心在于Werkzeug(路由模块), Jinja2模板引擎.
  Flask的"轻"
  Flask的"轻", 不代表其功能不够强大, Flask拥有丰富的扩展, 其依赖于扩展来给应用添加功能, 众多的插件提供了数据库集成, 
表单验证, 上传处理,各种各样的开放认证技术等, Flask的这些特性使得它在web开发方面变得非常流行
  注意: 如果构建大型项目, 使用很多扩展, Flask也会变的跟Django一样的重.

Flask框架介绍与环境搭建

为了防止 django和 flask环境相互冲突,可以使用 虚拟环境分割开

pip install virtualenv virtualenvwrapper-win  # 安装虚拟环境基本的依赖包

mkvirtualenv flask  # 创建一个叫 flask的虚拟环境
workon flask  # 进入虚拟环境flask
rmvirtualenv flask  # 删除名叫 flask的虚拟环境
deactivate  # 退出当前虚拟环境


pip freeze > requirements.txt  #生成依赖清单 
pip install -r requirements.txt  # 自动安装依赖

基本流程

配置项可以参考 官方 文档'

  • 创建flaskAPP
  • 定义视图函数
  • 对视图函数配置路由
    • 使用装饰器,配置路由
    • 调用app的方法 add_url_rule 对视图函数配置路由
  • 直接运行APP
from flask import Flask

# __name__ 当前 文件的名字
# __file__ 当前 文件的路径
# 1. 创建flask的app
app = Flask(__name__)


# 2.1 创建视图函数,利用装饰器可以配置路由
@app.route('/')
def hello():
    return "hello Flask"


# 2.2.1 创建视图函数
def two():
    return 'two page'

# 2.2.2 利用app的方法对视图函数添加路由
app.add_url_rule('/two', view_func=two)


if __name__ == '__main__':
    # 3. 运行APP
    app.run()

项目配置

配置文件

通过专门的配置文件,读取配置项,适用于配置项较多

配置文件

通过专门的配置文件,读取配置项,适用于配置项较多

settings.py

class Config(object):
    DEBUG = True

主模块

import os
from flask import Flask
from settings import Config

app = Flask(__name__)

# app.config.from_object('settings.Config')
app.config.from_object(Config)


@app.route('/')
def hello():
    return "hello Flask"


if __name__ == '__main__':
    app.run()

工厂模式

如果在一个函数中 创建对象,那么就可以创建多个实例。

那么这样做有什么用呢?

  1. 用于测试。可以针对不同的情况使用不同的配置来测试应用。
  2. 用于多实例,如果你需要运行同一个应用的不同版本的话。当然你可以在服务器上 使用不同配置运行多个相同应用,但是如果使用应用工厂,那么你可以只使用一个 应用进程而得到多个应用实例,这样更容易操控。

app/settings.py

class Config(object):
    # 配置项在flask文档中已经规定好

    DEBUG = True

app/__init__.py

from flask import Flask
from .settings import Config


def create_app():
    # 1. 创建app对象
    app = Flask(__name__)
    # 2. 导入配置类
    app.config.from_object(Config)
	# 3. 返回 flask对象
    return app

主模块

main.py

# 1. 导入工厂函数
from app import create_app

# 2. 生成APP
app = create_app()


@app.route('/')
def hello():
    return "hello Flask"


if __name__ == '__main__':
    # 3. 启动flask服务
    app.run(host='0.0.0.0', port=7000, debug=True)

项目构造

python包

flask项目,一切功能围绕 核心app 来完成, 这个包就用来构造 核心APP

  • app/settings.py: 项目的配置文件
class Config(object):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@localhost:3306/flask'
    # mysql://用户名:密码@IP地址:端口号/数据库名
    SQLALCHEMY_TRACK_MODIFICATIONS = False
  • app/extensions.py: 项目所使用的第三方扩展插件
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_cors import CORS

# 环境中,使用 mysqlclient 链接mysql,就可以正常使用
# 如果使用的是pymysql链接 mysql, 就需要加一些配置项
# import pymysql
# pymysql.install_as_MySQLdb()


db = SQLAlchemy()
migrate = Migrate()
cors = CORS()


def config_extensions(app):
    db.init_app(app)
    migrate.init_app(app, db=db)
    cors.init_app(app)
  • app/__init__.py: 定义工厂函数,生成核心 flask APP
from flask import Flask
from .settings import Config
from .extensions import config_extensions


def create_app():
    # 1. 创建APP
    app = Flask(__name__)
    # 2. 导入配置参数
    app.config.from_object(Config)
    # 3. 导入 第三方的插件
    config_extensions(app)

    # 4. 返回APP
    return app

项目的管理文件

在项目中,创建 manage.py

  • manage.py
from flask_script import Manager, Server
from flask_migrate import MigrateCommand
from app import create_app

# 1. 利用工厂函数生成app
app = create_app()

# 2. 创建管理对象,管理项目
manage = Manager(app)

# 3. 构建命令
manage.add_command('runserver', Server(host='0.0.0.0', port=7000))
manage.add_command('db', MigrateCommand)

if __name__ == '__main__':
    # 利用管理器启动服务
    manage.run()

命令

在项目的终端可以使用如下命令,操作项目

python manage.py runserver  # 启动flask 服务


python manage.py db init # 只有第一次迁移时,才会执行 该命令, 执行完,会生成迁移文件
python manage.py db migrate  # 生成迁移文件,出路第一次之外,任何修改模型类,都需要 执行该命令, 生成迁移文件

python manage.py  db upgrade  # 根据迁移文件,生成表
posted @ 2021-06-01 16:44  叁年py  阅读(56)  评论(0)    收藏  举报