项目作者: saurabh1e

项目描述 :
Restful API framework wrapped around Sqlalchemy.
高级语言: Python
项目地址: git://github.com/saurabh1e/SuperFlaskSeed.git
创建时间: 2016-11-13T12:35:54Z
项目社区:https://github.com/saurabh1e/SuperFlaskSeed

开源协议:MIT License

下载


Flask Super Seed

Flask Seed is a production ready seed app with following plugins integrated.

  • Flask Admin
  • Flask Security
  • Flask User
  • Flask RestFul
  • Flask Marshmallow
  • Flask Script
  • Flask Migrate

Using the seed:

  • Create Models
  • Create Schemas for the model
  • Define Resources for your schema’s and model’s
  • Define value for following in your resource
    • model = None
    • schema = None
      • filters = {}
      • fields = ()
      • max_limit = 100
      • default_limit = 20
      • related_resource = {}
      • order_by = []
      • only = ()
      • exclude = ()
      • auth_required = False/True
        • roles_accepted = () access if any of these roles assigned to user
        • roles_required = () access if all of these roles assigned to user
  • Define View for your resource
    • Add methods to api_methods in your view (BulkUpdate, List, Fetch, Create, Delete, Update)
    • View are of 2 types Base and Association View.
    • Base view supports (BulkUpdate, List, Fetch, Create, Delete, Update)
      • BulkUpdate PUT update single or multiple resource
      • Save POST save single or multiple resource
      • Update PATCH update single resource
      • List GET fetch multiple resource
      • Fetch GET fetch single resource
    • AssociationView for Association table to create, delete or update relation among Resources using Patch call.

Example

User Model

  1. class User(db.Model, BaseMixin, UserMixin, ReprMixin):
  2. email = db.Column(db.String(127), unique=True, nullable=False)
  3. password = db.Column(db.String(255), default='', nullable=False)
  4. username = db.Column(db.String(127), nullable=True)
  5. active = db.Column(db.Boolean())
  6. confirmed_at = db.Column(db.DateTime())
  7. last_login_at = db.Column(db.DateTime())
  8. current_login_at = db.Column(db.DateTime())
  9. last_login_ip = db.Column(db.String(45))
  10. current_login_ip = db.Column(db.String(45))
  11. login_count = db.Column(db.Integer)
  12. roles = db.relationship('UserRole', back_populates='user')
  13. user_profile = db.relationship("UserProfile", uselist=False, back_populates="user", cascade='all, delete-orphan')
  14. @hybrid_property
  15. def name(self):
  16. if self.user_profile and self.user_profile.first_name:
  17. if self.user_profile.last_name:
  18. return self.user_profile.first_name + self.user_profile.last_name
  19. return self.user_profile.first_name

Role Model

  1. class Role(db.Model, RoleMixin, ReprMixin):
  2. id = db.Column(db.Integer(), primary_key=True)
  3. name = db.Column(db.String(80), unique=True)
  4. description = db.Column(db.String(255))
  5. users = db.relationship('UserRole', back_populates='role')

UserRole Model

  1. class UserRole(db.Model, BaseMixin):
  2. user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))
  3. role_id = db.Column(db.Integer(), db.ForeignKey('role.id', ondelete='CASCADE'))
  4. user = db.relationship('User', back_populates='roles')
  5. role = db.relationship('Role', back_populates='users')
  6. UniqueConstraint(user_id, role_id)

Schemas

  1. class UserSchema(BaseSchema):
  2. class Meta:
  3. model = User
  4. exclude = ('created_on', 'updated_on', 'password', 'current_login_at', 'current_login_ip',
  5. 'last_login_at', 'last_login_ip', 'login_count')
  6. id = ma.Integer(dump_only=True)
  7. email = ma.Email(unique=True, primary_key=True, required=True)
  8. username = ma.String(required=True)
  9. user_profile = ma.Nested('UserProfileSchema', load=True, many=False, exclude=('user',))
  10. roles = ma.Nested('RoleSchema', many=True, dump_only=True)

Resources

  1. class UserResource(ModelResource):
  2. model = User
  3. schema = UserSchema
  4. filters = {
  5. 'username': [ops.Equal, ops.Contains],
  6. 'active': [ops.Boolean]
  7. }
  8. related_resource = {
  9. 'user_profile': UserProfileResource
  10. }
  11. order_by = ['email', 'id']
  12. only = ()
  13. exclude = ()
  14. def has_read_permission(self, request, qs):
  15. return qs
  16. def has_change_permission(self, request, obj):
  17. return True
  18. def has_delete_permission(self, request, obj):
  19. return True
  20. def has_add_permission(self, request, obj):
  21. return True

View

  1. @api.register()
  2. class UserListView(BaseView):
  3. resource = UserResource
  4. @api.register()
  5. class UserRoleAssociationView(AssociationView):
  6. resource = UserRoleResource

This will create following resource’s

  • /user//
    • GET /user/1/
    • Get single instance of resource
    • PATCH /user/1/
    • Update single instance of resource
    • Delete /user/1/
    • Delete single instance of resource
  • /user/
    • GET /user/
    • Get multiple instance of resource
    • POST /user/
    • Create multiple or single instance of resource
    • PUT /user/
    • Update multiple or single instance of resource
  • /user_role/
    • Patch /user_role/
    • Patch multiple association among resource
      • Example:
        • [ {“user_id”:1,”role_id”:1, “action”: “add”}, {“user_id”:1,”role_id”:1, “action”: “remove”}]