今天的主要内容有:数据库迁移;邮件扩展,蓝图,单元测试以及RESTful。
需要先在虚拟环境中安装Flask-Migigrate
pip install flask-migrate
需要使用flask-migrate中的Migrate类以及MigrateCommand类,前者负责关联app和数据库实例,后者包含了一些执行命令
为什么要使用flask-migrate迁移数据库操作
配置阶段
from flask_migrate import Migrate,MigrateCommand
migrate = Migrate(app,db)
manager.add_command('db',MigrateCommand)
执行阶段
python database.py db init
python database.py db migrate -m 'initial migration'
python database.py db upgrade
完整代码
#coding=utf-8
from flask import Flaskfrom flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate,MigrateCommand
from flask_script import Shell,Managerapp = Flask(__name__)
manager = Manager(app)app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/Flask_test'
db = SQLAlchemy(app)#第一个参数是Flask的实例,第二个参数是Sqlalchemy数据库实例
migrate = Migrate(app,db) #manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令
manager.add_command('db',MigrateCommand)#定义模型Role
class Role(db.Model):# 定义表名__tablename__ = 'roles'# 定义列对象id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64), unique=True)user = db.relationship('User', backref='role')#repr()方法显示一个可读字符串,def __repr__(self):return 'Role:'.format(self.name)#定义用户
class User(db.Model):__talbe__ = 'users'id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(64), unique=True, index=True)#设置外键role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))def __repr__(self):return 'User:'.format(self.username)if __name__ == '__main__':manager.run()
命令行迁移命令
初始化迁移文件夹
python app.py db history
python app.py db downgrade 版本号
from flask_mail import Mail, Message
app.config['MAIL_SERVER'] = "smtp.126.com"
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_USERNAME'] = "huidongpeng@126.com"
app.config['MAIL_PASSWORD'] = "heima666"
app.config['MAIL_DEFAULT_SENDER'] = 'FlaskAdmin
mail = Mail(app)
msg = Message('这是邮件的主题', recipients=['huidongpeng@126.com'],body='This is flask mail')
- 6 发送邮件
mail.send(msg)
#coding:utf-8
from flask import Flask
from flask_mail import Mail, Messageapp = Flask(__name__)# 配置邮件:服务器/端口/安全套接字层/邮箱名/授权码
app.config['MAIL_SERVER'] = "smtp.126.com"
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_USERNAME'] = "huidongpeng@126.com"
app.config['MAIL_PASSWORD'] = "heima666"
app.config['MAIL_DEFAULT_SENDER'] = 'FlaskAdmin
def hello_world():return '发送邮件'@app.route('/send_mail')
def send_mail():msg = Message('这是邮件的主题', recipients=['huidongpeng@126.com'],body='This is flask mail')mail.send(msg)return '已发送邮件'if __name__ == '__main__':app.run(debug=True)
这些操作方法在Blueprint被注册到应用之后,就可以被调用。Flask可以通过Blueprint来组织URL以及处理请求
属性:
admin=Blueprint('admin',__name__)
@admin.route('/')
def admin_home():return 'admin_home'
app.register_blueprint(admin,url\_prefix='/admin')
assert expression 'AssertionError'
if not expression: raise AssertionError
assertEqual 如果两个值相等,则pass
assertNotEqual 如果两个值不相等,则pass
assertTrue 判断bool值为True,则pass
assertFalse 判断bool值为False,则pass
assertIsNone 不存在,则pass
assertIsNotNone 存在,则pass
import unittest
class TestClass(unitest.TestCase):pass
import unittest
class TestClass(unittest.TestCase):#该方法会首先执行,方法名为固定写法def setUp(self):pass#该方法会在测试代码执行完后执行,方法名为固定写法def tearDown(self):pass
import unittest
class TestClass(unittest.TestCase):#该方法会首先执行,相当于做测试前的准备工作def setUp(self):pass#该方法会在测试代码执行完后执行,相当于做测试后的扫尾工作def tearDown(self):pass#测试代码def test_app_exists(self):pass
http://api.example.com
或者将api放在主域名下:
http://www.example.com/api/
http://www.example.com/app/1.0/info
http://www.example.com/app/1.2/info
错误示例:
http://www.example.com/getGoods
http://www.example.com/listOrders
正确示例:
#获取单个商品http://www.example.com/app/goods/1
#获取所有商品http://www.example.com/app/goods
对于资源的具体操作类型,由HTTP动词表示。 常用的HTTP动词有四个。
GET SELECT :从服务器获取资源。
POST CREATE :在服务器新建资源。
PUT UPDATE :在服务器更新资源。
DELETE DELETE :从服务器删除资源。
示例
#获取指定商品的信息GET http://www.example.com/goods/ID#新建商品的信息POST http://www.example.com/goods#更新指定商品的信息PUT http://www.example.com/goods/ID#删除指定商品的信息DELETE http://www.example.com/goods/ID
#指定返回数据的数量http://www.example.com/goods?limit=10
#指定返回数据的开始位置http://www.example.com/goods?offset=10
#指定第几页,以及每页数据的数量http://www.example.com/goods?page=2&per_page=20
0 OK :服务器成功返回用户请求的数据
201 CREATED :用户新建或修改数据成功。
202 Accepted:表示请求已进入后台排队。
400 INVALID REQUEST :用户发出的请求有错误。
401 Unauthorized :用户没有权限。
403 Forbidden :访问被禁止。
404 NOT FOUND :请求针对的是不存在的记录。
406 Not Acceptable :用户请求的的格式不正确。
500 INTERNAL SERVER ERROR :服务器发生错误
{error: 'Invalid API KEY'
}
#返回商品列表GET http://www.example.com/goods#返回单个商品GET http://www.example.com/goods/cup#返回新生成的商品POST http://www.example.com/goods#返回一个空文档DELETE http://www.example.com/goods
9 使用链接关联相关的资源
在返回响应结果时提供链接其他API的方法,使客户端很方便的获取相关联的信息。
10 其他
服务器返回的数据格式,应该尽量使用JSON,避免使用XML。