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 中默认实现了 GroupMixinUserMixin 如果要创建 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.UserMixinflask_maple.permission.models.GroupMixin 或者直接使用 flask_maple.auth.models.UserMixinflask_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="")

然后访问 http://127.0.0.1/captcha

配置

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"]

日志

记录 infoerror 两个日志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_mailTrue时, 配置依赖于 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 = {...}
作者: honmaple
链接: https://honmaple.me/articles/2018/02/flask_maple文档.html
版权: CC BY-NC-SA 4.0 知识共享署名-非商业性使用-相同方式共享4.0国际许可协议
wechat
alipay

加载评论