正文 不得不說(shuō)flask的設(shè)計(jì)要比django要小巧精妙的多了,沒(méi)有那么臃腫,只保留核心功能,其他的都需要自己引入,即各種各樣的插件來(lái)滿足我們的需求,我這里記錄一下自己學(xué)習(xí)項(xiàng)目中用的插件使用方法和一些技巧總結(jié)! 先放一下代碼地址: https:///houzheng1216/pythonxuexi/tree/master/flask/fristflask 一 flask-clifalsk內(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í)例,。 導(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: 自定義命令: # 自定義命令,分組命令,使用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) 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-loginFlask-Login 為 Flask 提供用戶 session 的管理機(jī)制,。它可以處理 Login,、Logout 和 session 等服務(wù)。 不過(guò)新出了更強(qiáng)大的權(quán)限框架Pycasbin 定義User模型: ''' 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
配置: # 配置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()
登錄登出方法: @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'))
權(quán)限控制: 使用@login_required 注解攔截函數(shù) 和admin一起使用,攔截后臺(tái)數(shù)據(jù)管理頁(yè)面,不會(huì)admin的可以先看flask-admin: 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)) 這樣只有Tom登錄之后才能看見(jiàn)后臺(tái)管理頁(yè)面:
五 flask-restful快速構(gòu)建restApi,還是很方便的,其實(shí)就是把一個(gè)url的增傷改查寫(xiě)到一個(gè)類里面: 新建api類: # 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" 配置: mail.init_app(app) # 注冊(cè)restful api api = Api(app) api.add_resource(RestUser, '/rest/<int:id>', '/rest/<name>') # 可使用多個(gè)url訪問(wèn)接口
六 flask-adminFlask提供了一個(gè)擴(kuò)展模塊幫助我們快速搭建一個(gè)后臺(tái)管理系統(tǒng),,這個(gè)模塊就是--Flask-Admin 這個(gè)可以提供所有model數(shù)據(jù)的增刪改查,而且非常靈活支持?jǐn)U展,比如禁用刪除,只顯示某一列等等: 配置: # 繼承ModelView,實(shí)現(xiàn)一些自定義擴(kuò)展 from models import User class MyModelView(ModelView):
# 初始化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)管理上): # 繼承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') 最終效果:
|
|
來(lái)自: 看見(jiàn)就非常 > 《待分類》