摘要:自行定義的方法用于權限判斷繼承至該類的用戶模型將作為未登陸時的用戶模型可以保持代碼的一致性。但是這樣的方法很危險,很造成一些其它項目的兼容性問題。打開頁面,顯示正常。
flask 相對于很多國企的 oracle 數據庫而言,是比較新的,因此很多古老的設計并不一定適合較新的 flask 的標準,但作為后來者,你得向前兼容,你得適應需求。項目描述
本章內容就來解釋一下上一章——基于 oracle 的 flask 項目(一)——配置項目留下的彩蛋——數據庫到底留下了什么樣的坑?
絕對大多數的網站需要管理功能的,這個功能是不對外開放,需要有權限的用戶登錄后才能操作的。這個登錄功能對于大牛來說,肯定是操作 session, cookies 了,其實不必這么麻煩, flask-login 插件可以解決你的登錄問題,但是要注意一些小細節,本章內容就是來討論一些細節內容。
本章主要幫你解決你的項目的 DBA 管理員沒有給你設置主鍵,主鍵也不是 id 的問題。
創建登錄模板在 app/templates/show 目錄下新建一個 login.html 頁面。
同時,對模板進行分割,創建文件夾 common , 將主模板 base.html,提示模板 alert.thml 、頭文件 header.html,側邊欄 sidebar.html 等共用文件,都放入該文件夾。
其中使用到一些 css 和 js 的內容,需要放在藍圖文件夾下的 static 文件夾里面。
個性化你的 web 主頁,設置你的 index.html。
使用數據庫及映射類使用數據庫及映射類的時候,需要用到 sqlalchemy 第三方庫, flask 也提供了一個封裝好的插件 flask-sqlalchemy ,拿來使用即可。但是要使用 sqlalchemy, 在創建映射類的時候,必須得設置主鍵。但是很多前輩的 DBA 們的眼里可是沒有 flask 的概念的,很多表是沒有設置主鍵的,我們該怎么辦?
答:先對 DBA 管理員翻個白眼,然后自己默默的做事吧。還能怎么辦呢!!!
找個具有唯一性,不重復的字段,在創建映射類的時候,把該字段定義為主鍵。也就是說,不管數據庫中是否定義了主鍵,只要映射類種定義了即可。
當然,有的同學會說,我們找不到具有唯一性,不重復的字段,該怎么辦?那就繼續給你的 DBA 管理員翻白眼唄,翻到他清醒為止。
還好,我的項目中的數據庫還是有主鍵的,無需在映射類種,建立虛假的主鍵。
內容不在贅述,請參加代碼。
設置 flask-login 初始化 flask-login在 app/__init__.py 里進行設置:
login_manager = LoginManager() login_manager.session_protection = "strong" # 可以設置None,"basic","strong" 以提供不同的安全等級,一般設置strong,如果發現異常會登出用戶。 login_manager.login_view = "show.login" # 這里填寫你的登陸界面的路由 def create_app(config_name): """ 使用工廠函數初始化程序實例""" .... login_manager.init_app(app=app)
很多時候,我們會遇到 remember_me 無效的情況,請將 login_manager.session_protection 設置成 basic 試試。
詳細設置請看程序注釋及[源代碼02]()。
配置 flask-login讓 models.py 中的用戶映射類繼承 flask_login 中的 UserMixin 類,該類實現了 4 個用戶方法,基本上能夠滿足用戶登錄的需求,如需其它的用戶方法,可自行定義。
class OusiStaff(UserMixin, db.Model): __tablename__ = "ousi_staff" sid = db.Column(db.Integer, primary_key=True) department = db.Column(db.String(8)) name = db.Column(db.String(8)) password = db.Column(db.String(8)) phone = db.Column(db.String(11)) role = db.Column(db.String(8)) def is_admin(self): # 自行定義的方法,用于權限判斷 return self.role == "admin" class AnonymousUser(AnonymousUserMixin): """ 繼承至該類的用戶模型 將作為未登陸時的用戶模型,可以保持代碼的一致性。 """ def is_admin(self): # 自行定義的方法,用于權限判斷 return False login_manager.anonymous_user = AnonymousUser實現用戶的回調函數
也是在 models.py 里實現:
@login_manager.user_loader def load_user(user_id): return OusiStaff.query.get(int(user_id))
此處,不詳細講解,僅僅是實現了一個回調用戶的函數。
使用登錄權限限制既然使用了登錄功能,那么肯定是有些內容不能讓未登錄的用戶觀看,這就需要在試圖函數定義的時候加上一個 login_required 裝飾器了。
這個功能的實現很簡單,在 views.py 里進行修改:
... from flask_login import login_required, login_user, logout_user ... @show.route("/", methods = ["GET", "POST"]) @show.route("/index", methods = ["GET", "POST"]) @login_required def index(): return render_template("show/index.html")
至此,你可以測試自己的項目了。
...
bug 如影隨從。這是你遇到的第一個錯誤。你會發現登錄之后馬上就報這個錯誤。那么兵來將擋水來土掩,找到問題,解決問題。
首先,報錯的地點顯示是我們自己的代碼中的 login_user,而真正報錯的地點是 minins.py 源碼中的 39 行,那么這一行的真面目是什么呢?
def get_id(self): try: return text_type(self.id) except AttributeError: raise NotImplementedError("No `id` attribute - override `get_id`")
你可以清晰的看到,這個 get_id 函數的返回值是 return text_type(self.id) 是當前用戶的 id。那么我們的 models.py 中定義的 OusiStaff 類有 id 這個字段嗎?沒有。只有一個作為主鍵的 sid 字段。看到這里,估計你會對以前的 DBA 管理員問候很多聲了,OK,稍安勿躁,問候了之后還得解決問題。很直觀的解決方法是,修改源碼,將 return text_type(self.id) 修改為 return text_type(self.sid)。但是這樣的方法很危險,很造成一些其它項目的兼容性問題。顯得這個程序員很 low。
再次我們用一種更好、更優雅的方法來解決。在 models.py 文件內的 OusiStaff 映射類中添加如下內容:
class OusiStaff(UserMixin, db.Model): ... ... @property def id(self): return self.sid
增加一個 id 屬性。解決問題。
神奇的 @property。 彩蛋就如此簡單的被解決。
打開頁面,顯示正常。
源碼下載
下節更精彩,我們將講解使用 flask-sqlalchemy 來生成相關報表。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41274.html
摘要:一般印象,項目適合做一些短小精悍的項目,特別是與等數據庫結合很是般配。生成報表,不同的查詢結果生成不同的報表。配置從下載客戶端,然后解壓后放入自己指定的目錄。指定數據庫連接池的超時時間。 一般印象,flask 項目適合做一些短小精悍的項目,特別是與 sqlite、mysql 等數據庫結合很是般配。但是在一些大公司,特別是一些金融行業等國企公司,還是以 oracle 居多,那么,這個小辣...
摘要:項目描述管理員用戶可以搜索本部門下所有用戶的各個月份的相關信息。不同的權限搜索頁面是不同的。結果展示第一個頁面第二個頁面這兩個動圖展示的是管理員權限的用戶的搜索查詢界面。 搜索功能是一個項目個性化需求最強烈的部分,用戶想要不同的報表,可以通過搜索不同的字段來實現。 項目描述 管理員用戶可以搜索本部門下所有用戶的各個月份的相關信息。 一般用戶只能搜索各個月份自己的相關信息。 實現搜索...
閱讀 2255·2023-04-26 02:14
閱讀 2926·2021-09-30 09:46
閱讀 2101·2021-09-24 09:48
閱讀 952·2021-09-24 09:47
閱讀 3252·2019-08-30 15:44
閱讀 1879·2019-08-30 15:44
閱讀 3279·2019-08-30 14:18
閱讀 1949·2019-08-30 12:58