不得不說flask的設計要比django要小巧精妙的多了,沒有那麼臃腫,只保留核心功能,其餘的都須要本身引入,即各類各樣的插件來知足咱們的需求,我這裏記錄一下本身學習項目中用的插件使用方法和一些技巧總結!html
先放一下代碼地址: https://gitee.com/houzheng1216/pythonxuexi/tree/master/flask/fristflaskpython
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 分組名稱 命令名稱 參數:
這個調試賊好用,簡單安裝配置使用就完事了
# 配置debugToolbar toolbar = DebugToolbarExtension() app.config['SECRET_KEY'] = 'hou' app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False # 不攔截重定向 toolbar.init_app(app)
使用,頁面右邊:
這裏貼一些經常使用config配置:
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登陸以後才能看見後臺管理頁面:
快速構建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提供了一個擴展模塊幫助咱們快速搭建一個後臺管理系統,這個模塊就是--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')
最終效果: