写在前面
flask中文文档
https://dormousehole.readthedocs.io/en/latest/
1、开始使用
新建flask项目
运行试试:python app.py
访问:
1.1、写一个html标签试试
注意:flask修改代码是不能自动重启的,这里我们手动重启一下
访问
1.2、参数配置
①debug=True
开启调试模式,修改代码会自动重启
访问
②PIN码
打开调试模式,启动后就会自动生成PIN码,PIN码用来在页面上调试时解锁
这里我们写一个会报错的代码试试
访问
当我们需要直接在页面上调试时就可以点击右边这个黑框框,然后输入PIN码
就可以直接在页面输入调试代码了
③Environment: production
启动的时候会有这个警告
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
这个警告的大概意思是提示这是开发者服务器,不能用于生产环境中,
如果需要关掉这个提示可以这么做:
Linux环境下:
进入~/.bashrc
在末尾加上这句话:export FLASK_ENV=‘develop’
windows环境下: set FLASK_ENV=‘develop’
④手动指定host和端口
2、flask插件
2.1、想和django保持一致?
使flask在命令行里也能改host和端口:
安装插件:pip install flask-script
更改app.py代码并运行:python app.py runserver
如果这里想和django一致,也可以更改app.py为manage.py
换个host试试:python manage.py runserver -p 8000 -h 0.0.0.0 -d -r
3、flask的MTV模型
我们在manage.py同目录下新建App文件夹,并创建__init__.py、models.py、views.py
mange.py
from App import create_app
from flask_script import Manager
app = create_app()
manager = Manager(app=app)
if __name__ == '__main__':
manager.run()
–init–.py
from App.views import init_route
from flask import Flask
def create_app():
app = Flask(__name__)
init_route(app)
return app
views.py
def init_route(app):
@app.route('/')
def hello_world():
return '学习flask中'
启动:python manage.py runserver
访问
4、路由
4.1、创建第二个路由
开启debug模式运行:python manage.py runserver -d -r
访问:http://127.0.0.1:5000/two/
4.2、flask-blueprint路由管理
像4.1里面那样创建路由容易出现循环引用的问题,flask-blueprint现在企业中常用的路由管理方式
安装:pip install flask-blueprint
安装完成之后修改views.py
from flask import Blueprint
blue = Blueprint('blue', __name__)
@blue.route('/')
def two():
return '蓝图路由主页'
修改–init–.py
开启debug模式运行:python manage.py runserver -d -r
访问:http://127.0.0.1:5000
4.3、把views.py转化成包
我们还可以把views.py转化成包,这样来写更多更复杂的路由
在views下创建一个新的文件first_blue.py,并删掉原来的views.py
在views/init.py导入first_blue
启动并访问:
创建第二个路由试试
在App/views/init.py导入second_blue
在App/init.py注册second
启动并访问:
到这儿我们会发现注册要写两次特别麻烦,其实我们可以把注册写到里一个init里
修改App/init.py
修改App/views/init.py
这样每次添加就只用注册一次
访问
5、模板
在App/templates里面写一个index.html
注意:
这里app里面的视图引用的html,最好放在app目录里面的templates,否则可能会导致找不到
关于路径问题可以参考这两个网址:
https://stackoverflow.com/questions/7974771/flask-blueprint-template-folder
https://blog.csdn.net/chengmo123/article/details/100558051
写到视图里
启动并访问:python manage.py runserver -r -d
5.1、模板语言
flask的模板语言和django使用的是同一套模板语言。
刨坑
填坑
访问
.
6、模型
6.1、flask-SQLAlchemy
SQLAlchemy:是Python编程语言下的对象关系映射(ORM)工具。
先安装flask-SQLAlchemy:pip install flask-sqlalchemy
开始使用,models.py
from flask_sqlalchemy import SQLAlchemy
models_db = SQLAlchemy()
def init_model(app):
models_db.init_app(app)
class User(models_db.Model):
# int类型,主键
id = models_db.Column(models_db.Integer, primary_key=True)
# 字符类型,长度为16
username = models_db.Column(models_db.String(16))
App/init.py(这里我们用的数据库是sqlite,如果要用mysql见下面注解)
# 配置数据库, uri 数据库+驱动://用户名:密码@主机:端口/具体哪一个库
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///sqlite.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
init_model(app)
下面注解部分,如果不换成mysql可以忽略
注解:使用mysql数据库
app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘mysql+pymysql://root:root@localhost:3306/HelloFlask’
使用mysql需要手动建库:
如果pymysql没有安装记得安装:pip install pymysql
first_bule.py写一个创建表的函数(sqlite和mysql都能创建)
运行并访问:
查看表是否创建成功(这里用的数据库是sqlite)
成功建表
7、改装,使得Falsk各种配置独立
7.1、单独写一个第三方扩展库文件
新建ext.py
把models放到ext里面
from flask_sqlalchemy import SQLAlchemy
models_db = SQLAlchemy()
def init_ext(app):
models_db.init_app(app=app)
App/models.py
在App/—int—.py中注册
7.2、单独写一个setting配置文件
新建settings.py
settings.py内容
# 获取数据库地址
def get_db_url(dbinfo):
engine = dbinfo.get("ENGINE") or "sqlite"
driver = dbinfo.get("DRIVER") or "sqlite"
user = dbinfo.get("USER") or ""
password = dbinfo.get("PASSWORD") or ""
host = dbinfo.get("HOST") or ""
port = dbinfo.get("PORT") or ""
name = dbinfo.get("NAME") or ""
return "{}+{}://{}:{}@{}:{}/{}".format(engine, driver, user, password, host, port, name)
class Config:
# 开发环境
DEBUG = False
# 测试环境
TESTING = False
# 数据库
SQLALCHEMY_TRACK_MODIFICATIONS = False
# 开发环境
class DevelopConfig(Config):
DEBUG = True
dbinfo = {
"ENGINE": "mysql",
"DRIVER": "pymysql",
"USER": "root",
"PASSWORD": "root",
"NAME": "HelloFlask",
"HOST": "localhost",
"PORT": "3306",
}
SQLALCHEMY_DATABASE_URI = get_db_url(dbinfo)
# 测试环境
class TestConfig(Config):
TESTING = True
dbinfo = {
# 什么数据库
"ENGINE": "mysql",
# 驱动名
"DRIVER": "pymysql",
# 数据库用户名
"USER": "root",
# 密码
"PASSWORD": "root",
# 创建的库名
"NAME": "HelloFlask",
"HOST": "localhost",
"PORT": "3306",
}
SQLALCHEMY_DATABASE_URI = get_db_url(dbinfo)
# 演示环境
class StagingConfig(Config):
dbinfo = {
# 什么数据库
"ENGINE": "mysql",
# 驱动名
"DRIVER": "pymysql",
# 数据库用户名
"USER": "root",
# 密码
"PASSWORD": "root",
# 创建的库名
"NAME": "HelloFlask",
"HOST": "localhost",
"PORT": "3306",
}
SQLALCHEMY_DATABASE_URI = get_db_url(dbinfo)
# 生产环境
class ProductConfig(Config):
DEBUG = True
dbinfo = {
# 什么数据库
"ENGINE": "mysql",
# 驱动名
"DRIVER": "pymysql",
# 数据库用户名
"USER": "root",
# 密码
"PASSWORD": "root",
# 创建的库名
"NAME": "HelloFlask",
"HOST": "localhost",
"PORT": "3306",
}
SQLALCHEMY_DATABASE_URI = get_db_url(dbinfo)
envs = {
"develop": DevelopConfig,
"testing": TestConfig,
"staging": StagingConfig,
"product": ProductConfig,
"default": DevelopConfig
}
App/–init–.py
写一个添加user的视图,看看配置是否成功
运行并访问
数据库
写一个删除整个库试试
访问
数据库:已经空了
7.3、使代码可以自己判断电脑环境是开发还是测试
修改App/–init–.py
修改manage.py
7.4、BASE_DIR
os.path.abspath(file)获取当前文件的绝对路径
os.path.dirname()获取当前路径的上一级路径
把BASE_DIR写到setting里面去
8、flask的迁移体系
安装migrate插件:pip install flask-migrate -i http://pypi.tuna.tsinghua.edu.cn/simple
ext.py
manage.py
运行初始化(只有该项目第一次使用migrate才执行这个):python manage.py db init
执行后会自动生成迁移文件
前后开始迁移:生成迁移python manage.py db migrate
执行迁移:python manage.py db upgrade(数据库里面对应也会生成迁移记录)
查看数据库
迁移文件和记录