flask-maple使用文档

2018-03-01 11:05:22来源:segmentfault作者:honmaple人点击

分享
安装

To install Flask-Maple:


pip install flask-maple

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


git clone [email protected]: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, GroupMixinclass User(db.Model, UserMixin):
passclass Group(db.Model, GroupMixin):
pass

即可


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

id
username
password
email
is_superuser
is_confirmed
register_time
last_login
groups

group 表默认创建以下字段

id
name
users
parent_group
child_groups权限
使用
from flask_maple.permission.models import PermissionMixinclass 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 authauth.init_app(app)# 或者
from flask_maple.auth.views import AuthAuth(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>
<div>
<a href="{{ url_for('auth.login') }}">{{ _('Login')}}</a>
</div>
<div>
{{ 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="")

然后访问 http://127.0.0.1/captcha


配置
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 Mailmail = Mail(app)
mail.send_email(*args, **kwargs)

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


from flask_maple.mail import MailMixinclass User(db.Model, MailMixin):
passprint(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 Serializerposts = 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 11serializer = Serializer(post,extra=['get_post_count'])自定义
from flask_maple.serializer import Serializerclass PostSerializer(Serializer):
class Meta:
include = []
depth = 2
include = []
exclude = []
extra = ['count']serializer = PostSerializer(post,include=['title'])中间件

参考于 django


from flask_maple.middleware import Middlewareapp = ...
Middleware(app)

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


class ProfileMiddleware(object):
def preprocess_request(self):
pr = cProfile.Profile()
pr.enable()
request.pr = prdef 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 Loggingapp = ...
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)sMessage:%(message)s
'''
}

当send_mail为 True时, 配置依赖于 flask_mail的配置(主要是不想写多份)


MAIL_USERNAME
MAIL_PASSWORD
MAIL_SERVER
MAIL_PORT
MAIL_DEFAULT_SENDERApp

创建两个常用的 url

/robots.txt
/favicon.ico使用
from flask_maple.app import AppApp(app)

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


from flask_maple.app import App
from flask_maple.json import CustomJSONEncoderApp(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>submit</button>
<span 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 Redisredis = Redis(app)# 像平时使用redispy一样使用
print(redis.get(...))配置
REDSI = {...}

具体例子可查看maple-bbs/extension


Github原文

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台