成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于 oracle 的 flask 項目(二)——用戶登錄

chunquedong / 2215人閱讀

摘要:自行定義的方法用于權(quán)限判斷繼承至該類的用戶模型將作為未登陸時的用戶模型可以保持代碼的一致性。但是這樣的方法很危險,很造成一些其它項目的兼容性問題。打開頁面,顯示正常。

flask 相對于很多國企的 oracle 數(shù)據(jù)庫而言,是比較新的,因此很多古老的設(shè)計并不一定適合較新的 flask 的標(biāo)準(zhǔn),但作為后來者,你得向前兼容,你得適應(yīng)需求。
本章內(nèi)容就來解釋一下上一章——基于 oracle 的 flask 項目(一)——配置項目留下的彩蛋——數(shù)據(jù)庫到底留下了什么樣的坑?
項目描述

絕對大多數(shù)的網(wǎng)站需要管理功能的,這個功能是不對外開放,需要有權(quán)限的用戶登錄后才能操作的。這個登錄功能對于大牛來說,肯定是操作 session, cookies 了,其實不必這么麻煩, flask-login 插件可以解決你的登錄問題,但是要注意一些小細(xì)節(jié),本章內(nèi)容就是來討論一些細(xì)節(jié)內(nèi)容。

本章主要幫你解決你的項目的 DBA 管理員沒有給你設(shè)置主鍵,主鍵也不是 id 的問題。

創(chuàng)建登錄模板

在 app/templates/show 目錄下新建一個 login.html 頁面。

同時,對模板進(jìn)行分割,創(chuàng)建文件夾 common , 將主模板 base.html,提示模板 alert.thml 、頭文件 header.html,側(cè)邊欄 sidebar.html 等共用文件,都放入該文件夾。

其中使用到一些 css 和 js 的內(nèi)容,需要放在藍(lán)圖文件夾下的 static 文件夾里面。

個性化你的 web 主頁,設(shè)置你的 index.html。

使用數(shù)據(jù)庫及映射類

使用數(shù)據(jù)庫及映射類的時候,需要用到 sqlalchemy 第三方庫, flask 也提供了一個封裝好的插件 flask-sqlalchemy ,拿來使用即可。但是要使用 sqlalchemy, 在創(chuàng)建映射類的時候,必須得設(shè)置主鍵。但是很多前輩的 DBA 們的眼里可是沒有 flask 的概念的,很多表是沒有設(shè)置主鍵的,我們該怎么辦?

答:先對 DBA 管理員翻個白眼,然后自己默默的做事吧。還能怎么辦呢?。?!
找個具有唯一性,不重復(fù)的字段,在創(chuàng)建映射類的時候,把該字段定義為主鍵。也就是說,不管數(shù)據(jù)庫中是否定義了主鍵,只要映射類種定義了即可。
當(dāng)然,有的同學(xué)會說,我們找不到具有唯一性,不重復(fù)的字段,該怎么辦?那就繼續(xù)給你的 DBA 管理員翻白眼唄,翻到他清醒為止。

還好,我的項目中的數(shù)據(jù)庫還是有主鍵的,無需在映射類種,建立虛假的主鍵。

內(nèi)容不在贅述,請參加代碼。

設(shè)置 flask-login 初始化 flask-login

app/__init__.py 里進(jìn)行設(shè)置:

login_manager = LoginManager()
login_manager.session_protection = "strong" # 可以設(shè)置None,"basic","strong"  以提供不同的安全等級,一般設(shè)置strong,如果發(fā)現(xiàn)異常會登出用戶。
login_manager.login_view = "show.login" # 這里填寫你的登陸界面的路由

def create_app(config_name):
    """ 使用工廠函數(shù)初始化程序?qū)嵗?""
    ....
    login_manager.init_app(app=app)

很多時候,我們會遇到 remember_me 無效的情況,請將 login_manager.session_protection 設(shè)置成 basic 試試。

詳細(xì)設(shè)置請看程序注釋及[源代碼02]()。

配置 flask-login

models.py 中的用戶映射類繼承 flask_login 中的 UserMixin 類,該類實現(xiàn)了 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): # 自行定義的方法,用于權(quán)限判斷
        return self.role == "admin"


class AnonymousUser(AnonymousUserMixin):
    """
    繼承至該類的用戶模型 將作為未登陸時的用戶模型,可以保持代碼的一致性。
    """
    def is_admin(self): # 自行定義的方法,用于權(quán)限判斷
        return False


login_manager.anonymous_user = AnonymousUser
實現(xiàn)用戶的回調(diào)函數(shù)

也是在 models.py 里實現(xiàn):

@login_manager.user_loader
def load_user(user_id):
    return OusiStaff.query.get(int(user_id))

此處,不詳細(xì)講解,僅僅是實現(xiàn)了一個回調(diào)用戶的函數(shù)。

使用登錄權(quán)限限制

既然使用了登錄功能,那么肯定是有些內(nèi)容不能讓未登錄的用戶觀看,這就需要在試圖函數(shù)定義的時候加上一個 login_required 裝飾器了。

這個功能的實現(xiàn)很簡單,在 views.py 里進(jìn)行修改:

...
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")

至此,你可以測試自己的項目了。


問題 NotImplementedError: No "id" attribute - override "get_id" 錯誤的問題


...

bug 如影隨從。這是你遇到的第一個錯誤。你會發(fā)現(xiàn)登錄之后馬上就報這個錯誤。那么兵來將擋水來土掩,找到問題,解決問題。

首先,報錯的地點顯示是我們自己的代碼中的 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 函數(shù)的返回值是 return text_type(self.id) 是當(dāng)前用戶的 id。那么我們的 models.py 中定義的 OusiStaff 類有 id 這個字段嗎?沒有。只有一個作為主鍵的 sid 字段??吹竭@里,估計你會對以前的 DBA 管理員問候很多聲了,OK,稍安勿躁,問候了之后還得解決問題。很直觀的解決方法是,修改源碼,將 return text_type(self.id) 修改為 return text_type(self.sid)。但是這樣的方法很危險,很造成一些其它項目的兼容性問題。顯得這個程序員很 low。

再次我們用一種更好、更優(yōu)雅的方法來解決。在 models.py 文件內(nèi)的 OusiStaff 映射類中添加如下內(nèi)容:

class OusiStaff(UserMixin, db.Model):
    ...
    ...
    
    @property
    def id(self):
        return self.sid

增加一個 id 屬性。解決問題。

神奇的 @property。 彩蛋就如此簡單的被解決。

打開頁面,顯示正常。

源碼下載

下節(jié)更精彩,我們將講解使用 flask-sqlalchemy 來生成相關(guān)報表。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41274.html

相關(guān)文章

  • 基于 oracle flask 項目(一)——配置項目

    摘要:一般印象,項目適合做一些短小精悍的項目,特別是與等數(shù)據(jù)庫結(jié)合很是般配。生成報表,不同的查詢結(jié)果生成不同的報表。配置從下載客戶端,然后解壓后放入自己指定的目錄。指定數(shù)據(jù)庫連接池的超時時間。 一般印象,flask 項目適合做一些短小精悍的項目,特別是與 sqlite、mysql 等數(shù)據(jù)庫結(jié)合很是般配。但是在一些大公司,特別是一些金融行業(yè)等國企公司,還是以 oracle 居多,那么,這個小辣...

    xialong 評論0 收藏0
  • 基于 oracle flask 項目(四)——搜索查詢

    摘要:項目描述管理員用戶可以搜索本部門下所有用戶的各個月份的相關(guān)信息。不同的權(quán)限搜索頁面是不同的。結(jié)果展示第一個頁面第二個頁面這兩個動圖展示的是管理員權(quán)限的用戶的搜索查詢界面。 搜索功能是一個項目個性化需求最強烈的部分,用戶想要不同的報表,可以通過搜索不同的字段來實現(xiàn)。 項目描述 管理員用戶可以搜索本部門下所有用戶的各個月份的相關(guān)信息。 一般用戶只能搜索各個月份自己的相關(guān)信息。 實現(xiàn)搜索...

    MyFaith 評論0 收藏0

發(fā)表評論

0條評論

chunquedong

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<