安装

To install Flask-Maple:

  1. pip install flask-maple

Or alternatively, you can download the repository and install manually by doing:

  1. git clone git@github.com:honmaple/flask-maple.git
  2. cd flask-maple
  3. python setup.py install

用户系统

flask_maple/auth/model.py 中默认实现了 GroupMixinUserMixin
如果要创建 user 表与 group 表,只需要

  1. from flask_maple.auth.models import UserMixin, GroupMixin
  2. class User(db.Model, UserMixin):
  3. pass
  4. class Group(db.Model, GroupMixin):
  5. pass

即可

user 表默认创建以下字段, 可添加更多想要的字段

  • id
  • username
  • password
  • email
  • is_superuser
  • is_confirmed
  • register_time
  • last_login
  • groups

group 表默认创建以下字段

  • id
  • name
  • users
  • parent_group
  • child_groups

权限

使用

  1. from flask_maple.permission.models import PermissionMixin
  2. class Permission(db.Model, PermissionMixin):
  3. pass

user 表与 group 表可继承 flask_maple.permission.models.UserMixinflask_maple.permission.models.GroupMixin
或者直接使用 flask_maple.auth.models.UserMixinflask_maple.auth.models.GroupMixin

  • 添加权限

    1. identity = user # or group
    2. identity.add_perm(
    3. action,
    4. resource,
    5. resource_type='endpoint',
    6. description=None)
  • 删除权限

    1. identity.remove_perm(
    2. action,
    3. resource,
    4. resource_type='endpoint')
  • 检查权限

    1. identity.has_perm(action, resource, resource_type='endpoint', and_=False)

权限缓存

默认权限会从数据库获取, 如果经常使用,可自行添加缓存, 并在添加删除权限后自行对缓存进行操作

  1. class User(db.Model, UserMixin):
  2. def perm_cache(self,
  3. action,
  4. resource,
  5. resource_type='endpoint',
  6. and_=False):
  7. return

登录

依赖于 flask-login, flask-mail

使用

  1. from flask_maple import auth
  2. auth.init_app(app)
  3. # 或者
  4. from flask_maple.auth.views import Auth
  5. Auth(app)

将会创建6个 url

  • /login
  • /logout
  • /register
  • /forget
  • /confirm
  • /confirm/<token>

可以自定义登陆,注册,忘记密码页面,以登陆页面为例 (templates/maple/login.html)

  1. {% extends "base/base.html" %}
  2. {%- block content -%}
  3. {% import 'maple/auth.html' as auth %}
  4. <div class="panel panel-primary">
  5. <div class="panel-heading">
  6. <a href="{{ url_for('auth.login') }}" style="color:#fff">{{ _('Login')}}</a>
  7. </div>
  8. <div class="panel-body">
  9. {{ auth.login()}}
  10. </div>
  11. </div>
  12. {% endblock %}

注意事项

登陆与登出默认使用 user.login(remember) , user.logout(), 如果未使用 flask_maple/auth/model.py 中的 UserMixin,则需要自己定义

验证码

使用 Pillow 生成验证码

  1. pip install pillow

使用

  1. from flask_maple import Captcha
  2. captcha = Captcha(app)
  3. # 因为字体可能存在版权问题,所以需要指定自己服务器字体, 默认为 /usr/share/fonts/TTF/DejaVuSans.ttf
  4. captcha = Captcha(app, font="")

然后访问 http://127.0.0.1/captcha

配置

  1. CAPTCHA_URL = "The captcha url,default 'captcha'"

错误处理

主要是对发生错误时的页面进行定制(403,404,500)

  1. from flask_maple import Error
  2. error = Error(app)

定制图片源于flask官网,侵删

邮箱

依赖于 flask-mail, 区别使用多线程发送

  1. from flask_maple.mail import Mail
  2. mail = Mail(app)
  3. mail.send_email(*args, **kwargs)

此外,还有一个 MailMixin,实现了邮箱验证需要的密钥,

  1. from flask_maple.mail import MailMixin
  2. class User(db.Model, MailMixin):
  3. pass
  4. print(user.email_token)
  5. print(User.check_email_token(token, max_age=259200))

数据库

像django一样使用 flask-sqlalchemy
djang orm 与sqlalchemy相比,为什么很多人都认为django orm更好用,大概就是因为django orm更方便

基本查询(已实现)

  • gt
  • lt
  • lte
  • gte
  • contains
  • in
  • exact
  • iexact
  • startswith
  • istartswith
  • iendswith
  • endswith
  • isnull
  • range
  • year
  • month
  • day

示例:

  1. Post.query.filter_by(title__contains = 'sql').all()
  2. Post.query.exclude_by(title__contains = 'sql').all()

关系查询

  1. Post.query.filter_by(tags__name__contains = 'sql').all()

其它

  1. Post.query.filter_by(tags__name__contains = 'sql').or(Post.id == 1,Post.id == 2).all()
  2. Post.query.filter_by(tags__name__contains = 'sql').and(Post.id == 1,Post.id == 2).all()
  3. Post.query.filter_by(tags__name__contains = 'sql').exists()
  4. Post.query.load_only('title')

序列化

sqlalchemy 对象序列化为 json, 使用方法参考于 django rest framework

多个实例

  1. from flask_maple.serializer import Serializer
  2. posts = Post.query.all()
  3. serializer = Serializer(posts)
  4. data = serializer.data

单个实例

  1. post = Post.query.first()
  2. serializer = Serializer(post)
  3. data = serializer.data

排除字段

  1. serializer = Seralizer(post,exclude=['title'])

仅包括字段

  1. serializer = Seralizer(post,include=['title'])

关系查询深度

  1. serializer = Seralizer(post,depth=3)

depth默认为2

额外的字段

  1. class Post(Model):
  2. ......
  3. def get_post_count(self):
  4. return 11
  5. serializer = Serializer(post,extra=['get_post_count'])

自定义

  1. from flask_maple.serializer import Serializer
  2. class PostSerializer(Serializer):
  3. class Meta:
  4. include = []
  5. depth = 2
  6. include = []
  7. exclude = []
  8. extra = ['count']
  9. serializer = PostSerializer(post,include=['title'])

中间件

参考于 django

  1. from flask_maple.middleware import Middleware
  2. app = ...
  3. Middleware(app)

中间件写法(以一个简单的性能测试中间件为例)

  1. class ProfileMiddleware(object):
  2. def preprocess_request(self):
  3. pr = cProfile.Profile()
  4. pr.enable()
  5. request.pr = pr
  6. def process_response(self, response):
  7. pr = request.pr
  8. pr.disable()
  9. s = StringIO()
  10. sortby = 'cumulative'
  11. ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
  12. ps.print_stats()
  13. print(s.getvalue())
  14. return response

重要 ,需要加入中间件配置

  1. MIDDLEWARE = ["path.to.ProfileMiddleware"]

日志

记录 infoerror 两个日志level, 使用很简单

  1. from flask_maple.log import Logging
  2. app = ...
  3. Logging(app)

配置文件

  1. LOGGING = {
  2. 'info': 'logs/info.log', # 记录info level的日志,与配置文件同级下的logs目录,可修改
  3. 'error': 'logs/error.log', # 记录error level的日志
  4. 'send_mail': False, # 当有错误发生时,是否发送邮件到管理员邮箱
  5. 'toaddrs': [], # 管理员邮箱,可为多个
  6. 'subject': 'Your Application Failed',
  7. 'formatter': '''
  8. Message type: %(levelname)s
  9. Location: %(pathname)s:%(lineno)d
  10. Module: %(module)s
  11. Function: %(funcName)s
  12. Time: %(asctime)s
  13. Message:
  14. %(message)s
  15. '''
  16. }

send_mailTrue时, 配置依赖于 flask_mail的配置(主要是不想写多份)

  1. MAIL_USERNAME
  2. MAIL_PASSWORD
  3. MAIL_SERVER
  4. MAIL_PORT
  5. MAIL_DEFAULT_SENDER

App

创建两个常用的 url

  • /robots.txt
  • /favicon.ico

使用

  1. from flask_maple.app import App
  2. App(app)

此外,因为国际化等原因,可以传递 flask_maple.json.CustomJSONEncoder 给App

  1. from flask_maple.app import App
  2. from flask_maple.json import CustomJSONEncoder
  3. App(app, json=CustomJSONEncoder)

配置

参考于 django,可以懒加载 blueprint

  1. INSTALLED_APPS = [
  2. "path.to.blueprint1",
  3. "path.to.blueprint2",
  4. {
  5. "kwargs":{},
  6. "blueprint":{}
  7. }
  8. ]

Bootstrap

主要是个人经常使用的一些模板,比如bootstrap的js,css文件,分页模板, 上下撑满等
并依赖于 flask-assets ,对js,css文件进行压缩

使用

  1. from flask_maple import Bootstrap
  2. bootstrap = Bootstrap(
  3. app,
  4. css=('styles/monokai.css', 'styles/mine.css'),
  5. js=('styles/upload.js', 'styles/forums.js', 'styles/following.js',
  6. 'styles/topic.js'),
  7. use_auth=True)

或者

  1. bootstrap = Bootstrap()
  2. bootstrap.init_app(app)

模板

  1. {% extends 'maple/base.html' %}
  2. {% block main -%}
  3. <button class="btn btn-primary">submit</button>
  4. <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
  5. {% endblock -%}

配置

  1. AUTHOR_NAME = "This will show you name at html footer"

Redis

默认会加载 rediscluster.StrictRedisCluster ,如果rediscluster未安装则加载 redis.StrictRedis

使用

  1. from flask_maple.redis import Redis
  2. redis = Redis(app)
  3. # 像平时使用redispy一样使用
  4. print(redis.get(...))

配置

  1. REDSI = {...}

flask_maple使用文档的更多相关文章

  1. C#给PDF文档添加文本和图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  2. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  3. ABP文档 - Javascript Api - AJAX

    本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...

  4. ABP文档 - EntityFramework 集成

    文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...

  5. ABP文档 - SignalR 集成

    文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...

  6. ABP文档 - 通知系统

    文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...

  7. ABP文档 - Hangfire 集成

    文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...

  8. ABP文档 - 后台作业和工作者

    文档目录 本节内容: 简介 后台作业 关于作业持久化 创建一个后台作业 在队列里添加一个新作业 默认的后台作业管理器 后台作业存储 配置 禁用作业执行 Hangfire 集成 后台工作者 创建一个后台 ...

  9. ABP文档 - Javascript Api

    文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions A ...

随机推荐

  1. 三大框架中各种xml的存放位置

      web.xml中classpath:和classpath*:  有什么区别? classpath:只会到你的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar ...

  2. Oracal 学习之用户角色创建分配表空间 给角色分配权限

    //创建角色inspur 密码为inspur,默认的表空间为USERS create user inspur identified by inspur default tablespace USERS ...

  3. 使用yarn 安装 Vue-DevTools

    1. 从 github 下载 vuejs/vue-devtools https://github.com/vuejs/vue-devtools/archive/dev.zip 2.安装yarn 及 编 ...

  4. 在WebGrid中做 批量删除操作

    一般的MVC WebGrid都是在每一行中加入 Edit Detail Delete 这些Link 去对每条记录去单独操作. 稍微研究了一下总结一个 做批量删除的办法. 1. 首先是在WebGrid中 ...

  5. chattr改变文件属性

    Linux chattr命令用于改变文件属性. 这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式: a:让文件或目录仅供附加用途. b:不更新文件或目录的最后存取时间. ...

  6. poj-3928(树状数组)

    题目链接:传送门 题意:n个乒乓球运动员要互相练习,都去一个运动员那里比赛,举办训练的运动员不能水平最高或最低. 现在给出n个运动员的水平,求出最终有多少种组合. 思路:先对运动员进行离散化,然后进行 ...

  7. ACM-ICPC 2018 徐州赛区网络预赛 G Trace(逆向,两颗线段树写法)

    https://nanti.jisuanke.com/t/31459 思路 凡是后面的轨迹对前面的轨迹有影响的,可以尝试从后往前扫 区间修改需要push_down,单点更新所以不需要push_up(用 ...

  8. 容器监控告警方案(cAdvisor + nodeExporter + alertmanager + prometheus +grafana)

    一.prometheus基本架构 Prometheus 是一套开源的系统监控报警框架.它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 ...

  9. js setInterval详解

    [自己总结]: 语法  setInterval(code,interval) ①可以有第三个参数,第三个参数作为第一个参数(函数)的参数 ②第一个参数是函数,有三种形式: 1.传函数名,不用加引号,也 ...

  10. DocumentFragment类型

    nodeType 11 nodeName #document-fragment nodeValue NULL parentNode null createdocumentfragment()方法创建了 ...