Flask 是一个 Python 实现的 Web 开发微框架。Flask 依赖两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 工具集。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
如果使用单模块,必须使用__name__关键字,因为模块的名称会因为它是单独启动还是作为模块导入会不相同,会影响Flask定位模版及静态文件的路径。其中 if __name__ =='__main__': 确保服务器只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是作为模块导入的时候。
外部可访问的服务器
如果你运行了这个服务器,你会发现它只能从你自己的计算机上访问,网络中其它任何的地方都不能访问。在调试模式下,用户可以在你的计算机上执行任意 Python 代码。因此,这个行为是默认的。
如果你禁用了 debug 或信任你所在网络的用户,你可以简单修改调用 run() 的方法使你的服务器公开可用,如下:
app.run(host='0.0.0.0')
这会让操作系统监听所有公网 IP。
调试模式
虽然 run() 方法适用于启动本地的开发服务器,但是你每次修改代码后都要手动重启它。这样并不够优雅,而且 Flask 可以做到更好。如果你启用了调试支持,服务器会在代码修改后自动重新载入,并在发生错误时提供一个相当有用的调试器。
app.run(debug=True)
唯一 URL / 重定向行为
若定义了@app.route('/projects/'),那么http://127.0.0.1:5000/projects会被重定向为http://127.0.0.1:5000/projects/
构造 URL
如果 Flask 能匹配 URL,那么 Flask 可以生成它们吗?当然可以。你可以用 url_for()来给指定的函数构造 URL。它接受函数名作为第一个参数,也接受对应 URL 规则的变量部分的命名参数。未知变量部分会添加到 URL 末尾作为查询参数。这里有一些例子:
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/')
def index(): pass
@app.route('/login')
def login(): pass
@app.route('/user/<username>')
def profile(username):pass
with app.test_request_context():
print (url_for('index'))
print (url_for('login'))
print (url_for('login', next='/'))
print (url_for('profile', username='John Doe'))
输出:
/
/login
/login?next=%2F
/user/John%20Doe
(这里也用到了 test_request_context() 方法,下面会解释。即使我们正在通过 Python 的 shell 进行交互,它依然会告诉 Flask 要表现为正在处理一个请求。请看下面的解释。 环境局部变量 )
为什么你要构建 URL 而非在模板中硬编码?这里有三个绝妙的理由:
- 反向构建通常比硬编码的描述性更好。更重要的是,它允许你一次性修改 URL, 而不是到处边找边改。
- URL 构建会转义特殊字符和 Unicode 数据,免去你很多麻烦。
- 如果你的应用不位于 URL 的根路径(比如,在 /myapplication 下,而不是 / ), url_for() 会妥善处理这个问题。
Flask_Migrate的介绍与安装:
- 介绍:因为采用`db.create_all`在后期修改字段的时候,不会自动的映射到数据库中,必须删除表,然后重新运行`db.craete_all`才会重新映射,这样不符合我们的需求。因此flask-migrate就是为了解决这个问题,她可以在每次修改模型后,可以将修改的东西映射到数据库中。
- 首先进入到你的虚拟环境中,然后使用`pip install flask-migrate`进行安装就可以了。
- 使用`flask_migrate`必须借助`flask_scripts`,这个包的`MigrateCommand`中包含了所有和数据库相关的命令。
- `flask_migrate`相关的命令:
* `python manage.py db init`:初始化一个迁移脚本的环境,只需要执行一次。
* `python manage.py db migrate`:将模型生成迁移文件,只要模型更改了,就需要执行一遍这个命令。
* `python manage.py db upgrade`:将迁移文件真正的映射到数据库中。每次运行了`migrate`命令后,就记得要运行这个命令。
注意点:需要将你想要映射到数据库中的模型,都要导入到`manage.py`文件中,如果没有导入进去,就不会映射到数据库中。`manage.py`的相关代码:
```
from flask_script import Manager
from migrate_demo import app
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Article
# init
# migrate
# upgrade
# 模型 -> 迁移文件 -> 表
manager = Manager(app)
# 1. 要使用flask_migrate,必须绑定app和db
migrate = Migrate(app,db)
# 2. 把MigrateCommand命令添加到manager中
manager.add_command('db',MigrateCommand)
if __name__ == '__main__':
manager.run()
```
最好为每个项目创建独立的虚拟环境,这样发布的时候可以明确指出项目所需依赖包,也便于自己理解所需的依赖包
- 利用命令行到虚拟环境的目录下激活虚拟环境D:\Projects\TestDemo\migrateDemo\flask_migrateenv\Scripts\ activate
- 进入到项目目录 cd D:\Projects\TestDemo\migrateDemo
- 输入迁移数据库命令 manage.py db init