flask_maple文档
安装
To install Flask-Maple:
1pip install flask-maple
Or alternatively, you can download the repository and install manually by doing:
1git clone git@github.com:honmaple/flask-maple.git 2cd flask-maple 3python setup.py install
用户系统
在 flask_maple/auth/model.py 中默认实现了 GroupMixin 与 UserMixin 如果要创建 user 表与 group 表,只需要
1from flask_maple.auth.models import UserMixin, GroupMixin 2 3class User(db.Model, UserMixin): 4 pass 5 6class Group(db.Model, GroupMixin): 7 pass
即可
user 表默认创建以下字段, 可添加更多想要的字段
-
id
-
username
-
password
-
email
-
is_superuser
-
is_confirmed
-
register_time
-
last_login
-
groups
group 表默认创建以下字段
-
id
-
name
-
users
-
parent_group
-
child_groups
权限
使用
1from flask_maple.permission.models import PermissionMixin 2 3class Permission(db.Model, PermissionMixin): 4 pass
user 表与 group 表可继承 flask_maple.permission.models.UserMixin 与 flask_maple.permission.models.GroupMixin 或者直接使用 flask_maple.auth.models.UserMixin 与 flask_maple.auth.models.GroupMixin
-
添加权限
1identity = user # or group 2identity.add_perm( 3 action, 4 resource, 5 resource_type='endpoint', 6 description=None)
-
删除权限
1identity.remove_perm( 2 action, 3 resource, 4 resource_type='endpoint')
-
检查权限
1identity.has_perm(action, resource, resource_type='endpoint', and_=False)
权限缓存
默认权限会从数据库获取, 如果经常使用,可自行添加缓存, 并在添加删除权限后自行对缓存进行操作
1class 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
使用
1from flask_maple import auth 2 3auth.init_app(app) 4 5# 或者 6from flask_maple.auth.views import Auth 7 8Auth(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 生成验证码
1pip install pillow
使用
1from flask_maple import Captcha 2captcha = Captcha(app) 3 4# 因为字体可能存在侵权,所以需要指定自己服务器字体, 默认为 /usr/share/fonts/TTF/DejaVuSans.ttf 5captcha = Captcha(app, font="")
配置
1CAPTCHA_URL = "The captcha url,default 'captcha'"
错误处理
主要是对发生错误时的页面进行定制(403,404,500)
1from flask_maple import Error 2error = Error(app)
定制图片源于flask官网,侵删
邮箱
依赖于 flask-mail, 区别使用多线程发送
1from flask_maple.mail import Mail 2 3mail = Mail(app) 4mail.send_email(*args, **kwargs)
此外,还有一个 MailMixin,实现了邮箱验证需要的密钥,
1from flask_maple.mail import MailMixin 2 3class User(db.Model, MailMixin): 4 pass 5 6print(user.email_token) 7print(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
示例:
1Post.query.filter_by(title__contains = 'sql').all() 2Post.query.exclude_by(title__contains = 'sql').all()
关系查询
1Post.query.filter_by(tags__name__contains = 'sql').all()
其它
1Post.query.filter_by(tags__name__contains = 'sql').or(Post.id == 1,Post.id == 2).all() 2Post.query.filter_by(tags__name__contains = 'sql').and(Post.id == 1,Post.id == 2).all() 3Post.query.filter_by(tags__name__contains = 'sql').exists() 4Post.query.load_only('title')
序列化
把 sqlalchemy 对象序列化为 json, 使用方法参考于 django rest framework
多个实例
1from flask_maple.serializer import Serializer 2 3posts = Post.query.all() 4serializer = Serializer(posts) 5data = serializer.data
单个实例
1post = Post.query.first() 2serializer = Serializer(post) 3data = serializer.data
排除字段
1serializer = Seralizer(post,exclude=['title'])
仅包括字段
1serializer = Seralizer(post,include=['title'])
关系查询深度
1serializer = Seralizer(post,depth=3)
depth默认为2
额外的字段
1class Post(Model): 2 ...... 3 def get_post_count(self): 4 return 11 5 6serializer = Serializer(post,extra=['get_post_count'])
自定义
1from flask_maple.serializer import Serializer 2 3class PostSerializer(Serializer): 4 class Meta: 5 include = [] 6 depth = 2 7 include = [] 8 exclude = [] 9 extra = ['count'] 10 11serializer = PostSerializer(post,include=['title'])
中间件
参考于 django
1from flask_maple.middleware import Middleware 2 3app = ... 4Middleware(app)
中间件写法(以一个简单的性能测试中间件为例)
1class ProfileMiddleware(object): 2 def preprocess_request(self): 3 pr = cProfile.Profile() 4 pr.enable() 5 request.pr = pr 6 7 def process_response(self, response): 8 pr = request.pr 9 pr.disable() 10 s = StringIO() 11 sortby = 'cumulative' 12 ps = pstats.Stats(pr, stream=s).sort_stats(sortby) 13 ps.print_stats() 14 print(s.getvalue()) 15 return response
重要 ,需要加入中间件配置
1MIDDLEWARE = ["path.to.ProfileMiddleware"]
日志
记录 info 和 error 两个日志level, 使用很简单
1from flask_maple.log import Logging 2 3app = ... 4Logging(app)
配置文件
1LOGGING = { 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 14 Message: 15 16 %(message)s 17 ''' 18}
当send_mail为 True时, 配置依赖于 flask_mail的配置(主要是不想写多份)
1MAIL_USERNAME 2MAIL_PASSWORD 3MAIL_SERVER 4MAIL_PORT 5MAIL_DEFAULT_SENDER
App
创建两个常用的 url
-
/robots.txt
-
/favicon.ico
使用
1from flask_maple.app import App 2 3App(app)
此外,因为国际化等原因,可以传递 flask_maple.json.CustomJSONEncoder 给App
1from flask_maple.app import App 2from flask_maple.json import CustomJSONEncoder 3 4App(app, json=CustomJSONEncoder)
配置
参考于 django,可以懒加载 blueprint
1INSTALLED_APPS = [ 2 "path.to.blueprint1", 3 "path.to.blueprint2", 4 { 5 "kwargs":{}, 6 "blueprint":{} 7 } 8]
Bootstrap
主要是个人经常使用的一些模板,比如bootstrap的js,css文件,分页模板, 上下撑满等 并依赖于 flask-assets ,对js,css文件进行压缩
使用
1from flask_maple import Bootstrap 2bootstrap = 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)
或者
1bootstrap = Bootstrap() 2bootstrap.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 -%}
配置
1AUTHOR_NAME = "This will show you name at html footer"
Redis
默认会加载 rediscluster.StrictRedisCluster ,如果rediscluster未安装则加载 redis.StrictRedis
使用
1from flask_maple.redis import Redis 2 3redis = Redis(app) 4 5# 像平时使用redispy一样使用 6print(redis.get(...))
配置
1REDSI = {...}
