Flask
记录学习 Flask 过程的笔记
Http方法
Http有多个访问URL的方法,默认情况下,路由只回应GET请求,但是通过app.route装饰器传递methods参数可以改变这个性为:
1 |
如果存在GET,那么也会自动地添加HEAD方法,无需干预。它会确保遵照HTTP RFC(描述HTTP协议的文档)处理HEAD请求,所以你完全可以忽略这部分的HTTP规范。从Flask 6.0起,它也实现了OPTIONS的自动处理
下面简要介绍HTTP方法和使用场景
- GET:获取资源,GET操作应该是幂等的
- HEAD:想要获取信息,但是只关心消息头。应用应该像处理GET请求一样来处理它,但是不返回实际内容
- POST:创建一个新的资源
- PUT:完整的替换资源或者创建资源。PUT操作虽然有副作用,但应该是幂等的
- OPTIONS:获取资源支持的所有HTTP方法
- PATCH:局部更新,修改某个已有的资源
(幂等:表示在相同的数据和参数下,执行一次或多次产生的效果是一样的)
使用url_for
生成路径代替绝对路径
不要在模板中写死静态文件路径,应该用url_for生成路径
1 | url_for('static', filename='style.css') |
生成的路径就是’/static/style.css’
当然我们也可以定制静态文件的真实目录:
1 | app = Flask(__name__, static_folder='/tmp') |
那么访问’https://localhost:9000/static/style.css',也就是访问/tmp/style.css这个文件
Flask-Migrate
在开发过程中我们经常会修改到model,此时一般的操作是先删除表,再使用Flask-SQLAlchemy的create_all()重新建表,数据就会全部丢失了
Flask-Migrate是数据库迁移框架,就像代码版本控制工具会监控代码改动一样,一个数据库迁移框架能跟踪数据库表的变化,并且能把新的改动应用到旧的表中
- 安装
1
pip install flask-migrate
- 使用Flask-Script命令行实现Flask-Migrate
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# manage.py
# 官方示例
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128))
if __name__ == '__main__':
manager.run() - 运行
- 初始化
migrate
本地仓库1
python manage.py db init
- 开始迁移
1
python manage.py db migrate
- 更新数据库
1
python manage.py db upgrade
- 获取帮助信息
1
python manage.py db --help
- 初始化
Requirements
应用应该包含一个requirements.txt,它记录了有着准确版本号的所有包依赖,能在其它环境下使用该文件快速安装所需要的依赖
自动生成
requirements.txt
文件,命令行输入以下命令1
pip freeze >requirements.txt
在新环境中,如果要快速恢复需要的依赖,只需执行以下命令即可
1
pip install -r requirements.txt
- 本文标题:Flask
- 本文作者:Thomas Woo
- 发布时间:2017-12-14 00:00
- 最后更新:2020-06-20 15:41
- 本文链接:http://smileorigin.site/python/framework/flask/flask-coding-technique/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明出处!