一個基于flask的web應(yīng)用誕生 記錄用戶賬戶登錄狀態(tài)(6)
之前登錄注冊的功能都已經(jīng)完成,但是登錄成功回到首頁發(fā)現(xiàn)還是白茫茫的一片,對的,title一直都寫得博客,那么最終目的也是寫出一個輕博客來,但是,在發(fā)表文章之前是不是要先記錄一下登錄狀態(tài)呢?
用戶登錄
登錄狀態(tài)的記錄方式有很多種,首先想到的應(yīng)該就是使用flask自帶的session,但flask還提供了一種更方便的擴展,即flask-login包,使用方式還和之前一樣,首先需要安裝:
pip3.6 install flask-login
然后在default.py中進行初始化:
from flask.ext.login import LoginManager ...... login_manager=LoginManager() login_manager.session_protection="strong" #可設(shè)置為None,basic,strong已提供不同的安全等級 login_manager.login_view="login" #設(shè)置登錄頁
然后按照需求對User模型進行修改,因為Flask-Login要求User模型必須實現(xiàn)四個方法,分別為:
is_authenticated() 判斷是否登錄,登錄返回True,否則返回False
is_active() 是否允許登錄,即用戶是否已被禁用,如禁用返回False
is_anonymous() False為普通用戶
get_id() 返回用戶唯一標識符,使用Unicode編碼
這四個方法在User模型中直接實現(xiàn)即可,但是還有一種更簡單的方式,即繼承Flask-Login提供的UserMixin類,它里邊包含了這些方法的默認實現(xiàn),修改后的User模型為:
from flask.ext.login import UserMixin class User(UserMixin,db.Model): __tablename__="users" id=db.Column(db.Integer,primary_key=True) ......
flask-login還要求程序?qū)崿F(xiàn)一個回調(diào)函數(shù),已使用指定的標識符家在用戶:
@login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id))
之后,就可以方便的使用flask-login框架,繼續(xù)修改首頁模板的導(dǎo)航部分,以便顯示用戶名及相應(yīng)信息:
{%extends "bootstrap/base.html "%}
{% block title%}牛博客 {% endblock %}<!--覆蓋title標簽-->
{% block navbar %}
<nav class="navbar navbar-inverse"><!-- 導(dǎo)航部分 -->
<div class="navbar-header">
<a class="navbar-brand" href="#" rel="external nofollow" rel="external nofollow" >
牛博客
</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/" rel="external nofollow" >首頁</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
{% if current_user.is_authenticated %}
<li><p class="navbar-text"><a href="#" rel="external nofollow" rel="external nofollow" class="navbar-link">{{current_user.username}}</a> 您好</p></li>
<li><a href="{{url_for('logout')}}" rel="external nofollow" >登出</a></li>
{% else %}
<li><a href="{{url_for('login')}}" rel="external nofollow" >登錄</a></li>
{% endif %}
</ul>
</div><!-- /.navbar-collapse -->
</nav>
{% endblock %}
{% block content %} <!--具體內(nèi)容-->
<div class="container">
</div>
{% endblock %}
這里新出現(xiàn)url_for方法,它的主要功能是使用程序中的信息生成URL,比如傳入視圖的方法名,生成對應(yīng)的url,還可以通過方法的動態(tài)參數(shù)生成url的參數(shù),如url_for('index',age=5)結(jié)果為/?age=5
主要內(nèi)容為判斷是否登錄,若登錄顯示 {{用戶名}}你好,并提供登出功能,否則顯示登錄鏈接。
修改登錄表單:
class LoginForm(Form):
username=StringField("請輸入用戶名",validators=[DataRequired()])
password=PasswordField("請輸入密碼")
remember_me=BooleanField("記住我")
submit=SubmitField("登錄")
增加記住我項目, BooleanField默認為多選按鈕
修改登錄視圖方法:
@app.route("/login",methods=["GET","POST"])
def login():
form=LoginForm()
if form.validate_on_submit():
username = form.username.data
password = form.password.data
user = User.query.filter_by(username=username, password=password).first()
if user is not None:
login_user(user,form.remember_me.data)
return redirect(url_for("index"))
else:
flash("您輸入的用戶名或密碼錯誤")
return render_template("/login.html",form=form) # 返回的仍為登錄頁
return render_template("/login.html",form=form)
其中l(wèi)ogin_user為flask_login插件提供,用于設(shè)置用戶登錄,其中第二個參數(shù)即為記住我選項,若輸入True,則提供cookie存儲狀態(tài),否則關(guān)閉瀏覽器狀態(tài)即取消
新增登出方法:
@app.route("/logout",methods=["GET","POST"])
@login_required
def logout():
logout_user()
return redirect(url_for("index"))
此方法很簡單,直接使用flask-login提供的登出方法即可,注意@login_required裝飾器表示,只有登錄用戶才可訪問此視圖方法。
運行測試一下,輸入首頁地址:

點擊右上角的登錄鍵:

輸入用戶名zhangji 密碼123 并選擇記住我,點擊確定:

注意紅線部分,顯示正常,此時點擊登出:

注意紅線部分,回到初始狀態(tài)。
章節(jié)結(jié)語
接下來本來應(yīng)該是發(fā)帖及關(guān)注功能,但很明顯,現(xiàn)在代碼都在default.py中,對于代碼結(jié)構(gòu)越來越力不從心,所以本章的篇幅比較小,下一章將重點對已有代碼進行重構(gòu),并對功能進行分組,然后在繼續(xù)寫接下來的功能。謝謝觀看。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Flask框架的學(xué)習(xí)指南之用戶登錄管理
- Python的Flask框架中實現(xiàn)簡單的登錄功能的教程
- 使用Python的Flask框架表單插件Flask-WTF實現(xiàn)Web登錄驗證
- bootstrap flask登錄頁面編寫實例
- Python的Flask框架應(yīng)用程序?qū)崿F(xiàn)使用QQ賬號登錄的方法
- Python的Flask框架中實現(xiàn)登錄用戶的個人資料和頭像的教程
- Vue+Flask實現(xiàn)簡單的登錄驗證跳轉(zhuǎn)的示例代碼
- flask使用session保存登錄狀態(tài)及攔截未登錄請求代碼
- python使用Flask操作mysql實現(xiàn)登錄功能
- Flask框架通過Flask_login實現(xiàn)用戶登錄功能示例
相關(guān)文章
Python利用Bokeh進行數(shù)據(jù)可視化的教程分享
Bokeh是Python中的數(shù)據(jù)可視化庫,提供高性能的交互式圖表和繪圖。本文將利用Bokeh繪制一些可視化圖表,文中的示例代碼講解詳細,感興趣的可以了解一下2022-08-08
python3.5+tesseract+adb實現(xiàn)西瓜視頻或頭腦王者輔助答題
這篇文章主要介紹了python3.5+tesseract+adb實現(xiàn)西瓜視頻或頭腦王者輔助答題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
Python filter()及reduce()函數(shù)使用方法解析
這篇文章主要介紹了Python filter()及reduce()函數(shù)使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
Python中POST調(diào)用Restful接口示例
這篇文章主要介紹了Python之POST調(diào)用Restful接口示例,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02

