最近学习了flask-script和flask-manage
话不多说先上组织flask项目组织架构图,这里是模仿了django模型相关框架,因为学习过django所以还是喜欢熟悉一点界面
这里按照django模式为每个模块单独定义一个包,例如本次做测试的crm包
一开始很困扰的是数据定义,如果放在manager或者__init__.py中,会照成循环引用的问题,然后后期可能会出现种种问题,所以这里做了一个中间件ext.py文件
内容如下:
from flask_sqlalchemy import SQLAlchemy
db=SQLAlchemy()
这句话含义创建一个SQLAlchemy实例
manage.py内容
from s1pro_flask import create_app,current_app,g,SQLAlchemy
from s1pro_flask import Api,Resource,Manager,MigrateCommand,Shell,Migrate
from ext import db
from crm.models import User
app=create_app()
db.init_app(app)
migrate = Migrate(app,db)
manager=Manager(app)
manager.add_command('db',MigrateCommand)
def make_shell_context():
return dict(app=app, db=db)
manager.add_command("shell",Shell(make_context=make_shell_context))
if __name__=='__main__':
manager.run()
crm.models的代码:
from ext import db
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(64),index=True,unique=True)
email = db.Column(db.String(120),index=True,unique=True)
realname=db.Column(db.String(60))
password_hash = db.Column(db.String(128))
def __repr__(self):
return '<用户名:{}>'.format(self.username)
这样就不会产生回调问题
s1pro_flask的__init__.py文件内容
from flask import Flask,current_app,g
from flask_script import Manager,Shell
from flask_sqlalchemy import SQLAlchemy
from flask_restful import Api,Resource
from flask_migrate import Migrate,MigrateCommand
from s1pro_flask.views import account
from crm.views import crm
def create_app():
app=Flask(__name__)
app.config.from_object('settings.DevelopmentConfig')
# print(app.config['SECRET_KEY'])
app.register_blueprint(account.ac)
app.register_blueprint(crm)
return app
上面的代码编写完成之后:就可以使用python manage.py脚本
可以采用runserver,也可以采用db
python manage.py db init --生成migrations文件夹
python manage.py db migrate–生成脚本文件,类似于django的make migrations
python manage.py db upgrade–脚本文件直接应用数据库中
至此我们的user表已经生成了,接下来就是使用类似于restframework的api接口来进行数据增删改查,这里偷懒了没有写前端,直接使用了postman来进行增删改查模拟操作
mysql中表数据如下
直接上api接口内容
from flask import Blueprint,jsonify,request
from flask_restful import Api,Resource,fields,marshal_with
from .models import User
from ext import db
crm=Blueprint('crm',__name__)
api=Api(crm)
class UserResource(Resource):
resource_fields = {
'id':fields.Integer,
'username': fields.String,
'email': fields.String,
'password_hash': fields.String,
'realname':fields.String
}
@marshal_with(resource_fields,envelope='全部用户详情')
def get(self):
res=db.session.query(User).all()
return res
def post(self):
username = request.form.get('username')
email = request.form.get('email')
realname = request.form.get('realname')
uo=User(**{'username':username,'email':email,'realname':realname})
db.session.add(uo)
db.session.commit()
return {'userpost':f'添加用户{username}成功'}
def put(self):
# print(request.form.get('id'))
id=request.form.get('id')
username=request.form.get('username')
# print(f"{id}{username}")
realname=request.form.get('realname')
uo=User.query.get(id)
uo.username=username
uo.realname=realname
db.session.add(uo)
db.session.commit()
return {'userput':f'用户{username}更新成功'}
def delete(self):
id = request.form.get('id')
uo=User.query.get(id)
db.session.delete(uo)
db.session.commit()
return {'userdelete':f'删除用户{id}成功'}
class RoleResource(Resource):
def get(self):
return {'roleget':'hello restful'}
def post(self):
return {'rolepost':'hello restful'}
def put(self):
return {'roleput':'hello restful'}
def delete(self):
return {'roledelete':'hello restful'}
api.add_resource(UserResource,'/user')
api.add_resource(RoleResource,'/role')
get
post
mysql数据库
put
delete
注意事项:
flask目前还没有类似于restframwork的listmixin,updatemixin…可以结合generviewset的简单获取model的序列化数据,所以有了fields,marshal_with这两个功能,主要是起序列化的作用,envelope='全部用户详情’为返回结果序列化字典key值
一个简单的restframework的api到此结束