资讯专栏INFORMATION COLUMN

flask-maple使用文档

_ang / 3068人阅读

摘要:安装用户系统在中默认实现了与如果要创建表与表只需要即可表默认创建以下字段可添加更多想要的字段表默认创建以下字段权限使用表与表可继承与或者直接使用与添加权限删除权限检查权限权限缓存默认权限会从数据库获取如果经常使用,可自行添加缓存并在

安装

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 中默认实现了 GroupMixinUserMixin
如果要创建 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

email

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.UserMixinflask_maple.permission.models.GroupMixin
或者直接使用 flask_maple.auth.models.UserMixinflask_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/

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

{% extends "base/base.html" %}
{%- block content -%}
{% import "maple/auth.html" as auth %}
{{ auth.login()}}
{% 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 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"]
日志

记录 infoerror 两个日志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_mailTrue时, 配置依赖于 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 -%}


{% 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 = {...}

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

Github 原文

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41437.html

相关文章

  • (翻译) MongoDB(4) 文档

    摘要:使用文档来存储数据纪录。是文档的二进制表示。文档的局限性文件有以下属性文档大小限制文档的最大值为。存储的文档的大小超过了最大值,提供。在版本之前,不会尽量维持原文档中的字段顺序。更新文档更新文档使用更新操作中指定字段去执行指定数据的修改。 MongoDB使用BSON文档来存储数据纪录。BSON是JSON文档的二进制表示。尽管它比JSON包含更多的数据类型。对于BSON规范,查看bson...

    TNFE 评论0 收藏0
  • Wizard 开源文档管理系统1.0发布啦

    摘要:总结如果你在为公司寻找一款开源免费的开发文档文档管理工具,不妨考虑一下项目,一定不会让你失望的。 Wizard 是一款开源文档管理系统,项目地址为 https://github.com/mylxsw/wizard。这个项目是 我 在2017年就开始开发的,起初只是想做一款能够在公司内部把Swagger文档管理起来的工具,但在这近两年的时间里,一直断断续续的为其添加各种功能,现在终于下决...

    cod7ce 评论0 收藏0
  • MongoDB(三):创建、更新和删除文档

    摘要:排序结果的条件修改器条件,用户对匹配的文档进行更新和必须指定一个布尔类型,表示是否删除文档和必须指定一个布尔类型,表示返回更新前的文档还是更新后的文档,默认是更新前的文档。 本文所有内容以MongoDB 3.2 为基础。 插入并保存文档 插入是添加数据的基本方法。可以使用insert插入一个文档: db.foo.insert({bar: baz}) 批量插入 使用批量插入,可以加快插入...

    zorro 评论0 收藏0
  • 《聊聊mongodb》系列三 了解一下MongoDB插入文档的操作~

    摘要:布尔类型,表示文档是否按照有序或者无序插入,默认是返回参数返回了含有操作状态的对象插入文档成功返回如下对象字段指明了插入文档的总数如果该操作遇到了错误对象将包含该错误信息例子四其它可以向集合中添加文档的方法和选项一起使用的。 上一节介绍了MongoDB的基本的命令,以及结构的了解,这一节的主题是介绍一下MongoDB的插入文档的操作的基础命令的使用,MongoDB当中文档的数据结构和j...

    ityouknow 评论0 收藏0
  • MongoDB指南---5、创建、删除文档

    摘要:例如,假设要删除集合中所有为的人删除数据是永久性的,不能撤销,也不能恢复。删除速度删除文档通常很快,但是如果要清空整个集合,那么使用直接删除集合会更快然后在这个空集合上重建各项索引。上一篇文章指南基础知识使用下一篇文章指南更新文档 上一篇文章:MongoDB指南---4、MongoDB基础知识-使用MongoDB Shell下一篇文章:MongoDB指南---6、更新文档 本章会介绍...

    jas0n 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<