安裝
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 中預設實現了 GroupMixin 與 UserMixin
如果要建立 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
- 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.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 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="")
配置
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"]
日誌
記錄 info 和 error 兩個日誌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_mail為 True時, 配置依賴於 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