flask_maple使用文档
安装
To install Flask-Maple:
pip install flask-maple
Or alternatively, you can download the repository and install manually by doing:
git clone git@github.com:honmaple/flask-maple.git
cd flask-maple
python setup.py install
用户系统
在 flask_maple/auth/model.py 中默认实现了 GroupMixin 与 UserMixin
如果要创建 user 表与 group 表,只需要
from flask_maple.auth.models import UserMixin, GroupMixin
class User(db.Model, UserMixin):
pass
class Group(db.Model, GroupMixin):
pass
即可
user 表默认创建以下字段, 可添加更多想要的字段
- id
- username
- password
- is_superuser
- is_confirmed
- register_time
- last_login
- groups
group 表默认创建以下字段
- id
- name
- users
- parent_group
- child_groups
权限
使用
from flask_maple.permission.models import PermissionMixin
class Permission(db.Model, PermissionMixin):
pass
user 表与 group 表可继承 flask_maple.permission.models.UserMixin 与 flask_maple.permission.models.GroupMixin
或者直接使用 flask_maple.auth.models.UserMixin 与 flask_maple.auth.models.GroupMixin
添加权限
identity = user # or group identity.add_perm( action, resource, resource_type='endpoint', description=None)
删除权限
identity.remove_perm( action, resource, resource_type='endpoint')
检查权限
identity.has_perm(action, resource, resource_type='endpoint', and_=False)
权限缓存
默认权限会从数据库获取, 如果经常使用,可自行添加缓存, 并在添加删除权限后自行对缓存进行操作
class User(db.Model, UserMixin):
def perm_cache(self,
action,
resource,
resource_type='endpoint',
and_=False):
return
登录
依赖于 flask-login, flask-mail
使用
from flask_maple import auth
auth.init_app(app)
# 或者
from flask_maple.auth.views import Auth
Auth(app)
将会创建6个 url
- /login
- /logout
- /register
- /forget
- /confirm
- /confirm/<token>
可以自定义登陆,注册,忘记密码页面,以登陆页面为例 (templates/maple/login.html)
{% extends "base/base.html" %}
{%- block content -%}
{% import 'maple/auth.html' as auth %}
<div class="panel panel-primary">
<div class="panel-heading">
<a href="{{ url_for('auth.login') }}" style="color:#fff">{{ _('Login')}}</a>
</div>
<div class="panel-body">
{{ auth.login()}}
</div>
</div>
{% endblock %}
注意事项
登陆与登出默认使用 user.login(remember) , user.logout(), 如果未使用 flask_maple/auth/model.py 中的 UserMixin,则需要自己定义
验证码
使用 Pillow 生成验证码
pip install pillow
使用
from flask_maple import Captcha
captcha = Captcha(app)
# 因为字体可能存在版权问题,所以需要指定自己服务器字体, 默认为 /usr/share/fonts/TTF/DejaVuSans.ttf
captcha = Captcha(app, font="")
配置
CAPTCHA_URL = "The captcha url,default 'captcha'"
错误处理
主要是对发生错误时的页面进行定制(403,404,500)
from flask_maple import Error
error = Error(app)
定制图片源于flask官网,侵删
邮箱
依赖于 flask-mail, 区别使用多线程发送
from flask_maple.mail import Mail
mail = Mail(app)
mail.send_email(*args, **kwargs)
此外,还有一个 MailMixin,实现了邮箱验证需要的密钥,
from flask_maple.mail import MailMixin
class User(db.Model, MailMixin):
pass
print(user.email_token)
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
示例:
Post.query.filter_by(title__contains = 'sql').all()
Post.query.exclude_by(title__contains = 'sql').all()
关系查询
Post.query.filter_by(tags__name__contains = 'sql').all()
其它
Post.query.filter_by(tags__name__contains = 'sql').or(Post.id == 1,Post.id == 2).all()
Post.query.filter_by(tags__name__contains = 'sql').and(Post.id == 1,Post.id == 2).all()
Post.query.filter_by(tags__name__contains = 'sql').exists()
Post.query.load_only('title')
序列化
把 sqlalchemy 对象序列化为 json, 使用方法参考于 django rest framework
多个实例
from flask_maple.serializer import Serializer
posts = Post.query.all()
serializer = Serializer(posts)
data = serializer.data
单个实例
post = Post.query.first()
serializer = Serializer(post)
data = serializer.data
排除字段
serializer = Seralizer(post,exclude=['title'])
仅包括字段
serializer = Seralizer(post,include=['title'])
关系查询深度
serializer = Seralizer(post,depth=3)
depth默认为2
额外的字段
class Post(Model):
......
def get_post_count(self):
return 11
serializer = Serializer(post,extra=['get_post_count'])
自定义
from flask_maple.serializer import Serializer
class PostSerializer(Serializer):
class Meta:
include = []
depth = 2
include = []
exclude = []
extra = ['count']
serializer = PostSerializer(post,include=['title'])
中间件
参考于 django
from flask_maple.middleware import Middleware
app = ...
Middleware(app)
中间件写法(以一个简单的性能测试中间件为例)
class ProfileMiddleware(object):
def preprocess_request(self):
pr = cProfile.Profile()
pr.enable()
request.pr = pr
def process_response(self, response):
pr = request.pr
pr.disable()
s = StringIO()
sortby = 'cumulative'
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats()
print(s.getvalue())
return response
重要 ,需要加入中间件配置
MIDDLEWARE = ["path.to.ProfileMiddleware"]
日志
记录 info 和 error 两个日志level, 使用很简单
from flask_maple.log import Logging
app = ...
Logging(app)
配置文件
LOGGING = {
'info': 'logs/info.log', # 记录info level的日志,与配置文件同级下的logs目录,可修改
'error': 'logs/error.log', # 记录error level的日志
'send_mail': False, # 当有错误发生时,是否发送邮件到管理员邮箱
'toaddrs': [], # 管理员邮箱,可为多个
'subject': 'Your Application Failed',
'formatter': '''
Message type: %(levelname)s
Location: %(pathname)s:%(lineno)d
Module: %(module)s
Function: %(funcName)s
Time: %(asctime)s
Message:
%(message)s
'''
}
当send_mail为 True时, 配置依赖于 flask_mail的配置(主要是不想写多份)
MAIL_USERNAME
MAIL_PASSWORD
MAIL_SERVER
MAIL_PORT
MAIL_DEFAULT_SENDER
App
创建两个常用的 url
- /robots.txt
- /favicon.ico
使用
from flask_maple.app import App
App(app)
此外,因为国际化等原因,可以传递 flask_maple.json.CustomJSONEncoder 给App
from flask_maple.app import App
from flask_maple.json import CustomJSONEncoder
App(app, json=CustomJSONEncoder)
配置
参考于 django,可以懒加载 blueprint
INSTALLED_APPS = [
"path.to.blueprint1",
"path.to.blueprint2",
{
"kwargs":{},
"blueprint":{}
}
]
Bootstrap
主要是个人经常使用的一些模板,比如bootstrap的js,css文件,分页模板, 上下撑满等
并依赖于 flask-assets ,对js,css文件进行压缩
使用
from flask_maple import Bootstrap
bootstrap = Bootstrap(
app,
css=('styles/monokai.css', 'styles/mine.css'),
js=('styles/upload.js', 'styles/forums.js', 'styles/following.js',
'styles/topic.js'),
use_auth=True)
或者
bootstrap = Bootstrap()
bootstrap.init_app(app)
模板
{% extends 'maple/base.html' %}
{% block main -%}
<button class="btn btn-primary">submit</button>
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
{% endblock -%}
配置
AUTHOR_NAME = "This will show you name at html footer"
Redis
默认会加载 rediscluster.StrictRedisCluster ,如果rediscluster未安装则加载 redis.StrictRedis
使用
from flask_maple.redis import Redis
redis = Redis(app)
# 像平时使用redispy一样使用
print(redis.get(...))
配置
REDSI = {...}
flask_maple使用文档的更多相关文章
- C#给PDF文档添加文本和图片页眉
页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...
- dotNET跨平台相关文档整理
一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...
- ABP文档 - Javascript Api - AJAX
本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...
- ABP文档 - EntityFramework 集成
文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...
- ABP文档 - SignalR 集成
文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...
- ABP文档 - 通知系统
文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...
- ABP文档 - Hangfire 集成
文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...
- ABP文档 - 后台作业和工作者
文档目录 本节内容: 简介 后台作业 关于作业持久化 创建一个后台作业 在队列里添加一个新作业 默认的后台作业管理器 后台作业存储 配置 禁用作业执行 Hangfire 集成 后台工作者 创建一个后台 ...
- ABP文档 - Javascript Api
文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions A ...
随机推荐
- 在Tomcat中部署Spring jpetstore
第三篇:在Tomcat中部署Spring jpetstore 博客分类: Java之web SpringTomcatMySQLJDBCMVC Spring samples中的jpetstore,基于 ...
- 乘积最大(NOIP2000&NOIP水题测试(2017082301))
题目链接:乘积最大 这道题显然是道区间dp. 难度不是很大. 思路也很清晰. 我们设计一个三维状态. ans[l][r][k] 这里表示在闭区间[l,r]上操作k次的最大值. 操作就是加乘号. 转移也 ...
- Linux下安装启动多个Mysql
网上找了N多资料,没有一个可以顺利成功的,郁闷,可能是水平有限吧...!本人经过不断的研究.测试,完整实现Linux下启动两台MySQL,而且对mysql有了更深入的了解...废话不多说,走着! 步骤 ...
- 35、输入框(UITextField)密码明暗文切换
- (IBAction)pwdTextSwitch:(UIButton *)sender { // 前提:在xib中设置按钮的默认与选中状态的背景图 // 切换按钮的状态 sender.selecte ...
- python中的特殊成员
python中的特殊成员: 小甲鱼论坛总结
- shell脚本清空redis库缓存
前提: 现在做的一个业务系统,用了redis做缓存. 系统做了缓存,通常在系统正常使用的过程中,可以节省很多系统资源,特别是数据库资源. 但是,在开发.测试或者系统遇到问题的时候,也有很麻烦的事情. ...
- 2018.10.27 codeforces402D. Upgrading Array(数论+贪心)
传送门 唉我觉得这题数据范围1e5都能做啊... 居然只出了2000 考完听zxyzxyzxy说我的贪心可以卡但过了? 可能今天本来是0+10+00+10+00+10+0只是运气好T1T1T1骗了10 ...
- 2018.10.24 NOIP模拟 小 C 的序列(链表+数论)
传送门 考虑到a[l],gcd(a[l],a[l+1]),gcd(a[l],a[l+1],a[l+2])....gcd(a[l]...a[r])a[l],gcd(a[l],a[l+1]),gcd(a[ ...
- 第1章 Python数据模型
#<流畅的Python>读书笔记 # 第一部分 序幕 # 第1章 Python数据模型 # 魔术方法(magic method)是特殊方法的昵称.于是乎,特殊方法也叫双下方法(dunder ...
- jquery checkbox反复调用attr('checked', true/false)只有第一次生效 Jquery 中 $('obj').attr('checked',true)失效的几种解决方案
1.$('obj').prop('checked',true) 2. $(':checkbox').each(function(){ this.checked=true; }) 为什么:attr为失效 ...