久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

flask插件全家桶集成學(xué)習(xí)

 看見(jiàn)就非常 2020-04-29

 

正文

       不得不說(shuō)flask的設(shè)計(jì)要比django要小巧精妙的多了,沒(méi)有那么臃腫,只保留核心功能,其他的都需要自己引入,即各種各樣的插件來(lái)滿足我們的需求,我這里記錄一下自己學(xué)習(xí)項(xiàng)目中用的插件使用方法和一些技巧總結(jié)!

先放一下代碼地址: https:///houzheng1216/pythonxuexi/tree/master/flask/fristflask

一 flask-cli

falsk內(nèi)置的腳手架,可代替flask-script管理項(xiàng)目,再也不用寫(xiě)manager.py了

啟動(dòng)項(xiàng)目: 根目錄命令: flask run

開(kāi)啟shell:  flask shell

開(kāi)啟一個(gè)交互式的python shell,用來(lái)訪問(wèn)或處理應(yīng)用數(shù)據(jù),。該指令默認(rèn)激活應(yīng)用上下文,并導(dǎo)入應(yīng)用實(shí)例,。
只有應(yīng)用實(shí)例是默認(rèn)導(dǎo)入的,,如果需要導(dǎo)入其他對(duì)象,使用shell_context_processor裝飾函數(shù),,返回一個(gè)字典對(duì)象,,鍵值對(duì)表示額外導(dǎo)入的對(duì)象。

導(dǎo)入:

# 在flask shell 中導(dǎo)入其他對(duì)象,導(dǎo)入后shell可以使用
@app.shell_context_processor
def make_shell_context():
    return dict(models=models, db=db)

 

開(kāi)啟之后默認(rèn)可查看app:

自定義命令:

復(fù)制代碼
# 自定義命令,分組命令,使用user管理多個(gè)命令

user_cli = AppGroup("user")


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


@user_cli.command("add")
@click.argument("num")
def add_num(num):
    print("result is", num+num)
復(fù)制代碼

app中注冊(cè)命令: 

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

使用命令,flask 分組名稱 命令名稱 參數(shù):

 


二 flask-debugToolbar

 這個(gè)調(diào)試賊好用,簡(jiǎn)單安裝配置使用就完事了

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

使用,頁(yè)面右邊:

這里貼一些常用config配置:

 

三 flask-WTF

 

四 falsk-login

Flask-Login 為 Flask 提供用戶 session 的管理機(jī)制,。它可以處理 Login,、Logout 和 session 等服務(wù)。
將用戶的 id 儲(chǔ)存在 session 中,,方便用于 Login/Logout 等流程,。
讓你能夠約束用戶 Login/Logout 的視圖
提供 remember me 功能
保護(hù) cookies 不被篡改,這個(gè)可以和flask-admin一起使用,很方便,適合簡(jiǎn)單輕量級(jí)的需求

不過(guò)新出了更強(qiáng)大的權(quán)限框架Pycasbin

定義User模型:

復(fù)制代碼
''' flask-login user類必須實(shí)現(xiàn)以下:
        is_authenticated 是否屬性
        is_active 是否激活屬性
        is_anonymous 是否匿名屬性
        get_id() 方法, 可以繼承UserMixin,提供了默認(rèn)實(shí)現(xiàn)
'''
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
復(fù)制代碼

 

配置:

復(fù)制代碼
# 配置flask-login
login_manager = LoginManager()
login_manager.login_view = 'myuser.login' # 指定跳轉(zhuǎn)登錄函數(shù),權(quán)限攔截時(shí)跳轉(zhuǎn)
login_manager.login_message_category = 'info'
login_manager.login_message = '請(qǐng)先登錄'
login_manager.init_app(app)

# 配置回調(diào)函數(shù),必須配置
# user session 記錄的是用戶 ID (user_id),回調(diào)函數(shù)的作用就是通過(guò) user_id 返回對(duì)應(yīng)的 User 對(duì)象
@login_manager.user_loader
def load_user(user_id):
    print(user_id)  # 登錄成功的時(shí)候會(huì)自動(dòng)獲取主鍵id
    return models.User.query.filter_by(id=user_id).first()
復(fù)制代碼

 

登錄登出方法:

復(fù)制代碼
@user.route('/login/', methods=['GET', 'POST'])
def login():
    form = LoginForm()  # 實(shí)例化form對(duì)象
    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:
            # 將用戶信息注冊(cè)到flask-login中
            login_user(user)
            return redirect(url_for('myuser.get_all_user'))
        else:
            flash("請(qǐng)重新輸入用戶名和密碼")
    return render_template('login.html', form=form)

@user.route('/logout/', methods=['GET', 'POST'])
@login_required   # 裝飾器,必須登錄才能有權(quán)限
def logout():
    logout_user()
    return redirect(url_for('myuser.get_all_user'))
復(fù)制代碼

 

權(quán)限控制:

使用@login_required 注解攔截函數(shù)

和admin一起使用,攔截后臺(tái)數(shù)據(jù)管理頁(yè)面,不會(huì)admin的可以先看flask-admin:

復(fù)制代碼
class MyModelView(ModelView):
    can_delete = True
    can_create = False  # 是否能創(chuàng)建
    # Override displayed fields
    column_list = ('name', 'age')  # 顯示的屬性
    # 重寫(xiě)方法實(shí)現(xiàn)權(quán)限控制
    def is_accessible(self):
        print(current_user.name)  #  獲取login的當(dāng)前用戶
        if current_user.is_authenticated and current_user.name == "Tom":
            return True
        return False
    # 訪問(wèn)頁(yè)面沒(méi)有權(quán)限時(shí)回調(diào)函數(shù),可跳轉(zhuǎn)登錄
    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))
復(fù)制代碼

這樣只有Tom登錄之后才能看見(jiàn)后臺(tái)管理頁(yè)面:

 

五 flask-restful

快速構(gòu)建restApi,還是很方便的,其實(shí)就是把一個(gè)url的增傷改查寫(xiě)到一個(gè)類里面:

新建api類:

復(fù)制代碼
# restful 構(gòu)建api
from models import User, db

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

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

    def post(self, name):
        # 解析參數(shù)
        parser = reqparse.RequestParser()
        # 添加參數(shù),校驗(yàn)等,help: 校驗(yàn)不通過(guò)時(shí)展示自定義信息, location 可指定參數(shù)解析位置
        parser.add_argument('age', type=int, required=True,
                            help='年齡必須是整數(shù),且不為空', location='form',
                            dest='age_alis')  # dest 使用別名存儲(chǔ)參數(shù),原來(lái)參數(shù)名key無(wú)法獲取
        args = parser.parse_args()
        # age = request.form.get('age')
        user = User(name=name, age=args['age_alis'])
        db.session.add(user)
        db.session.commit()
        # 繼承父類參數(shù)
        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"
復(fù)制代碼

配置:

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

 

六 flask-admin

Flask提供了一個(gè)擴(kuò)展模塊幫助我們快速搭建一個(gè)后臺(tái)管理系統(tǒng),,這個(gè)模塊就是--Flask-Admin

這個(gè)可以提供所有model數(shù)據(jù)的增刪改查,而且非常靈活支持?jǐn)U展,比如禁用刪除,只顯示某一列等等:

配置:

復(fù)制代碼
# 繼承ModelView,實(shí)現(xiàn)一些自定義擴(kuò)展
from models import User


class MyModelView(ModelView):
# 這里可以定制權(quán)限管理 can_delete = True can_create = False # 是否能創(chuàng)建 # Override displayed fields column_list = ('name', 'age') # 顯示的屬性 # 重寫(xiě)方法實(shí)現(xiàn)權(quán)限控制 def is_accessible(self): print(current_user.name) # 獲取login的當(dāng)前用戶 if current_user.is_authenticated and current_user.name == "Tom": return True return False # 訪問(wèn)頁(yè)面沒(méi)有權(quán)限時(shí)回調(diào)函數(shù),可跳轉(zhuǎn)登錄 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))
復(fù)制代碼

 

# 初始化admin后臺(tái)管理
admin = Admin(app, name='MyWebSite', template_mode='bootstrap3')
# 注冊(cè)模型用來(lái)管理,可自定義url,避免沖突(此處也使用藍(lán)圖,名字默認(rèn)使用model的小寫(xiě)名字,名字不能與藍(lán)圖名字沖突)
admin.add_view(MyModelView(models.User, db.session, name=u'用戶管理', url='user/manage'))
admin.add_view(UserView(name='自定義視圖'))

定制視圖(把某些頁(yè)面放在后臺(tái)管理上):

復(fù)制代碼
# 繼承BaseView進(jìn)行視圖頁(yè)面定制
class UserView(BaseView):
    # 使用expose進(jìn)行路由,每個(gè)視圖必須有一個(gè) '/' 函數(shù),否則報(bào)錯(cuò)
    @expose('/')
    def index(self):
        return self.render('boot.html')

    @expose('/user_manager')
    def user_manager(self):
        return self.render('boot.html')
復(fù)制代碼

最終效果:

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多