flask-maple使用文件

honmaple發表於2019-02-16

安裝

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/<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="")

然後訪問 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 -%}
<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 = {...}

具體例子可檢視maple-bbs/extension

Github 原文

相關文章