最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一個(gè)基于flask的web應(yīng)用誕生 記錄用戶賬戶登錄狀態(tài)(6)

 更新時(shí)間:2017年04月11日 11:02:31   作者:雙魚座的牛  
一個(gè)基于flask的web應(yīng)用誕生第六篇,這篇文章主要介紹了記錄用戶賬戶登錄狀態(tài)功能開發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

之前登錄注冊(cè)的功能都已經(jīng)完成,但是登錄成功回到首頁(yè)發(fā)現(xiàn)還是白茫茫的一片,對(duì)的,title一直都寫得博客,那么最終目的也是寫出一個(gè)輕博客來(lái),但是,在發(fā)表文章之前是不是要先記錄一下登錄狀態(tài)呢?

用戶登錄

登錄狀態(tài)的記錄方式有很多種,首先想到的應(yīng)該就是使用flask自帶的session,但flask還提供了一種更方便的擴(kuò)展,即flask-login包,使用方式還和之前一樣,首先需要安裝:

pip3.6 install flask-login

然后在default.py中進(jìn)行初始化:

from flask.ext.login import LoginManager

......

login_manager=LoginManager()
login_manager.session_protection="strong" 

#可設(shè)置為None,basic,strong已提供不同的安全等級(jí)
login_manager.login_view="login" #設(shè)置登錄頁(yè)

然后按照需求對(duì)User模型進(jìn)行修改,因?yàn)镕lask-Login要求User模型必須實(shí)現(xiàn)四個(gè)方法,分別為:

is_authenticated() 判斷是否登錄,登錄返回True,否則返回False
is_active() 是否允許登錄,即用戶是否已被禁用,如禁用返回False
is_anonymous() False為普通用戶
get_id() 返回用戶唯一標(biāo)識(shí)符,使用Unicode編碼

這四個(gè)方法在User模型中直接實(shí)現(xiàn)即可,但是還有一種更簡(jiǎn)單的方式,即繼承Flask-Login提供的UserMixin類,它里邊包含了這些方法的默認(rèn)實(shí)現(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)一個(gè)回調(diào)函數(shù),已使用指定的標(biāo)識(shí)符家在用戶:

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

之后,就可以方便的使用flask-login框架,繼續(xù)修改首頁(yè)模板的導(dǎo)航部分,以便顯示用戶名及相應(yīng)信息:

{%extends "bootstrap/base.html "%}
{% block title%}牛博客 {% endblock %}<!--覆蓋title標(biāo)簽-->

{% 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" >首頁(yè)</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,比如傳入視圖的方法名,生成對(duì)應(yīng)的url,還可以通過(guò)方法的動(dòng)態(tài)參數(shù)生成url的參數(shù),如url_for('index',age=5)結(jié)果為/?age=5

主要內(nèi)容為判斷是否登錄,若登錄顯示 {{用戶名}}你好,并提供登出功能,否則顯示登錄鏈接。

修改登錄表單:

class LoginForm(Form):
  username=StringField("請(qǐng)輸入用戶名",validators=[DataRequired()])
  password=PasswordField("請(qǐng)輸入密碼")
  remember_me=BooleanField("記住我")
  submit=SubmitField("登錄")

增加記住我項(xiàng)目, BooleanField默認(rèn)為多選按鈕

修改登錄視圖方法:

@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("您輸入的用戶名或密碼錯(cuò)誤")
      return render_template("/login.html",form=form) # 返回的仍為登錄頁(yè)
  return render_template("/login.html",form=form)

其中l(wèi)ogin_user為flask_login插件提供,用于設(shè)置用戶登錄,其中第二個(gè)參數(shù)即為記住我選項(xiàng),若輸入True,則提供cookie存儲(chǔ)狀態(tài),否則關(guān)閉瀏覽器狀態(tài)即取消

新增登出方法:

@app.route("/logout",methods=["GET","POST"])
@login_required
def logout():
  logout_user()
  return redirect(url_for("index"))

此方法很簡(jiǎn)單,直接使用flask-login提供的登出方法即可,注意@login_required裝飾器表示,只有登錄用戶才可訪問(wèn)此視圖方法。

運(yùn)行測(cè)試一下,輸入首頁(yè)地址:

點(diǎn)擊右上角的登錄鍵:

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

注意紅線部分,顯示正常,此時(shí)點(diǎn)擊登出:

注意紅線部分,回到初始狀態(tài)。

章節(jié)結(jié)語(yǔ)

接下來(lái)本來(lái)應(yīng)該是發(fā)帖及關(guān)注功能,但很明顯,現(xiàn)在代碼都在default.py中,對(duì)于代碼結(jié)構(gòu)越來(lái)越力不從心,所以本章的篇幅比較小,下一章將重點(diǎn)對(duì)已有代碼進(jìn)行重構(gòu),并對(duì)功能進(jìn)行分組,然后在繼續(xù)寫接下來(lái)的功能。謝謝觀看。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

平陆县| 桂阳县| 章丘市| 九台市| 红安县| 崇义县| 宾阳县| 马关县| 陈巴尔虎旗| 嘉义市| 马边| 庆阳市| 永寿县| 马边| 京山县| 安阳市| 望奎县| 永宁县| 高密市| 沙雅县| 龙泉市| 贵德县| 宽城| 泸州市| 平阳县| 普定县| 东兰县| 锦州市| 济源市| 巩留县| 神农架林区| 杨浦区| 远安县| 茌平县| 思南县| 栾川县| 汽车| 溧水县| 岳普湖县| 遂溪县| 仙游县|