flask插件全家桶集成學習---持續更新ing

       不得不說flask的設計要比django要小巧精妙的多了,沒有那麼臃腫,只保留核心功能,其餘的都須要本身引入,即各類各樣的插件來知足咱們的需求,我這裏記錄一下本身學習項目中用的插件使用方法和一些技巧總結!html

先放一下代碼地址: https://gitee.com/houzheng1216/pythonxuexi/tree/master/flask/fristflaskpython

一 flask-cli

falsk內置的腳手架,可代替flask-script管理項目,不再用寫manager.py了git

啓動項目: 根目錄命令: flask runshell

開啓shell:  flask shelldjango

開啓一個交互式的python shell,用來訪問或處理應用數據。該指令默認激活應用上下文,並導入應用實例。
只有應用實例是默認導入的,若是須要導入其餘對象,使用shell_context_processor裝飾函數,返回一個字典對象,鍵值對錶示額外導入的對象。flask

導入:bootstrap

# 在flask shell 中導入其餘對象,導入後shell可使用
@app.shell_context_processor
def make_shell_context():
    return dict(models=models, db=db)

 

開啓以後默承認查看app:api

自定義命令:restful

# 自定義命令,分組命令,使用user管理多個命令

user_cli = AppGroup("user")


@user_cli.command("print")  # 指定命令
@click.argument("name")  # 指定參數
def print_user(name):
    print("this is", name)


@user_cli.command("add")
@click.argument("num")
def add_num(num):
    print("result is", num+num)

app中註冊命令: cookie

# 添加自定義命令
app.cli.add_command(user_cli)

使用命令,flask 分組名稱 命令名稱 參數:

 

 

二 flask-debugToolbar

 這個調試賊好用,簡單安裝配置使用就完事了

# 配置debugToolbar
toolbar = DebugToolbarExtension()
app.config['SECRET_KEY'] = 'hou'
app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False  # 不攔截重定向
toolbar.init_app(app)

使用,頁面右邊:

這裏貼一些經常使用config配置:

 

三 flask-WTF

 

四 falsk-login

Flask-Login 爲 Flask 提供用戶 session 的管理機制。它能夠處理 Login、Logout 和 session 等服務。
將用戶的 id 儲存在 session 中,方便用於 Login/Logout 等流程。
讓你可以約束用戶 Login/Logout 的視圖
提供 remember me 功能
保護 cookies 不被篡改,這個能夠和flask-admin一塊兒使用,很方便,適合簡單輕量級的需求

不過新出了更強大的權限框架Pycasbin

定義User模型:

''' flask-login user類必須實現如下:
        is_authenticated 是否屬性
        is_active 是否激活屬性
        is_anonymous 是否匿名屬性
        get_id() 方法, 能夠繼承UserMixin,提供了默認實現
'''
class User(db.Model, UserMixin):
    __tablename__ = 'user'  # 表名
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    password = db.Column(db.String(50))
    age = db.Column(db.Integer)
    write_time = db.Column(db.DateTime, default=datetime.now())
    # toString方法
    def __repr__(self):
        return '<User %r>' % self.name

 

配置:

# 配置flask-login
login_manager = LoginManager()
login_manager.login_view = 'myuser.login' # 指定跳轉登陸函數,權限攔截時跳轉
login_manager.login_message_category = 'info'
login_manager.login_message = '請先登陸'
login_manager.init_app(app)

# 配置回調函數,必須配置
# user session 記錄的是用戶 ID (user_id),回調函數的做用就是經過 user_id 返回對應的 User 對象
@login_manager.user_loader
def load_user(user_id):
    print(user_id)  # 登陸成功的時候會自動獲取主鍵id
    return models.User.query.filter_by(id=user_id).first()

 

登陸登出方法:

@user.route('/login/', methods=['GET', 'POST'])
def login():
    form = LoginForm()  # 實例化form對象
    if request.method == "POST" and form.validate_on_submit():
        username = request.form.get('username')
        password = request.form.get('password')
        user = User.query.filter_by(name=username, password=password).first()
        if user:
            # 將用戶信息註冊到flask-login中
            login_user(user)
            return redirect(url_for('myuser.get_all_user'))
        else:
            flash("請從新輸入用戶名和密碼")
    return render_template('login.html', form=form)

@user.route('/logout/', methods=['GET', 'POST'])
@login_required   # 裝飾器,必須登陸纔能有權限
def logout():
    logout_user()
    return redirect(url_for('myuser.get_all_user'))

 

權限控制:

使用@login_required 註解攔截函數

和admin一塊兒使用,攔截後臺數據管理頁面,不會admin的能夠先看flask-admin:

class MyModelView(ModelView):
    can_delete = True
    can_create = False  # 是否能建立
    # Override displayed fields
    column_list = ('name', 'age')  # 顯示的屬性
    # 重寫方法實現權限控制
    def is_accessible(self):
        print(current_user.name)  #  獲取login的當前用戶
        if current_user.is_authenticated and current_user.name == "Tom":
            return True
        return False
    # 訪問頁面沒有權限時回調函數,可跳轉登陸
    def inaccessible_callback(self, name, **kwargs):
        # redirect to login page if user doesn't have access
        return redirect(url_for('myuser.login', next=request.url))

這樣只有Tom登陸以後才能看見後臺管理頁面:

 

五 flask-restful

快速構建restApi,仍是很方便的,其實就是把一個url的增傷改查寫到一個類裏面:

新建api類:

# restful 構建api
from models import User, db

# 返回格式
resource_fields = {
    'id': fields.Integer,
    'name': fields.String,
    'age': fields.String,
    'write_time': fields.String
}

class RestUser(Resource):
    # 格式化返回結果,envelope 數據顯示名字
    @marshal_with(resource_fields, envelope="user")
    def get(self, id):
        return User.query.filter_by(id=id).first(), 200

    def post(self, name):
        # 解析參數
        parser = reqparse.RequestParser()
        # 添加參數,校驗等,help: 校驗不經過時展現自定義信息, location 可指定參數解析位置
        parser.add_argument('age', type=int, required=True,
                            help='年齡必須是整數,且不爲空', location='form',
                            dest='age_alis')  # dest 使用別名存儲參數,原來參數名key沒法獲取
        args = parser.parse_args()
        # age = request.form.get('age')
        user = User(name=name, age=args['age_alis'])
        db.session.add(user)
        db.session.commit()
        # 繼承父類參數
        parser_copy = parser.copy()
        # 覆蓋或者刪除
        parser_copy.replace_argument('age', type=int, required=True)
        parser_copy.remove_argument('age')
        return "success"
    def delete(self, id):
        user = User.query.filter_by(id=id).first()
        db.session.add(user)
        return "ok"

配置:

mail.init_app(app)
# 註冊restful api
api = Api(app)
api.add_resource(RestUser, '/rest/<int:id>', '/rest/<name>')  # 可以使用多個url訪問接口

 

六 flask-admin

Flask提供了一個擴展模塊幫助咱們快速搭建一個後臺管理系統,這個模塊就是--Flask-Admin

這個能夠提供全部model數據的增刪改查,並且很是靈活支持擴展,好比禁用刪除,只顯示某一列等等:

配置:

# 繼承ModelView,實現一些自定義擴展
from models import User


class MyModelView(ModelView):
# 這裏能夠定製權限管理 can_delete
= True can_create = False # 是否能建立 # Override displayed fields column_list = ('name', 'age') # 顯示的屬性 # 重寫方法實現權限控制 def is_accessible(self): print(current_user.name) # 獲取login的當前用戶 if current_user.is_authenticated and current_user.name == "Tom": return True return False # 訪問頁面沒有權限時回調函數,可跳轉登陸 def inaccessible_callback(self, name, **kwargs): # redirect to login page if user doesn't have access return redirect(url_for('myuser.login', next=request.url))

 

# 初始化admin後臺管理
admin = Admin(app, name='MyWebSite', template_mode='bootstrap3')
# 註冊模型用來管理,可自定義url,避免衝突(此處也使用藍圖,名字默認使用model的小寫名字,名字不能與藍圖名字衝突)
admin.add_view(MyModelView(models.User, db.session, name=u'用戶管理', url='user/manage'))
admin.add_view(UserView(name='自定義視圖'))

定製視圖(把某些頁面放在後臺管理上):

# 繼承BaseView進行視圖頁面定製
class UserView(BaseView):
    # 使用expose進行路由,每一個視圖必須有一個 '/' 函數,不然報錯
    @expose('/')
    def index(self):
        return self.render('boot.html')

    @expose('/user_manager')
    def user_manager(self):
        return self.render('boot.html')

最終效果:

相關文章
相關標籤/搜索