一個web應用的誕生(6)

來源:互聯網
上載者:User

標籤:ring   default   ...   錯誤   簡單   成功   使用   password   lte   

之前登入註冊的功能都已經完成,但是登入成功回到首頁發現還是白茫茫的一片,對的,title一直都寫得部落格,那麼最終目的也是寫出一個輕部落格來,但是,在發表文章之前是不是要先記錄一下登入狀態呢?

使用者登入

登入狀態的記錄方式有很多種,首先想到的應該就是使用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" #可設定為None,basic,strong已提供不同的安全等級login_manager.login_view="login" #設定登入頁

然後按照需求對User模型進行修改,因為Flask-Login要求User模型必須實現四個方法,分別為:

is_authenticated() 判斷是否登入,登入返回True,否則返回False
is_active() 是否允許登入,即使用者是否已被禁用,如禁用返回False
is_anonymous() False為普通使用者
get_id() 返回使用者唯一識別碼,使用Unicode編碼

這四個方法在User模型中直接實現即可,但是還有一種更簡單的方式,即繼承Flask-Login提供的UserMixin類,它裡邊包含了這些方法的預設實現,修改後的User模型為:

from flask.ext.login import UserMixinclass User(UserMixin,db.Model):    __tablename__="users"    id=db.Column(db.Integer,primary_key=True)    ......    

flask-login還要求程式實現一個回呼函數,已使用指定的標識符家在使用者:

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

之後,就可以方便的使用flask-login架構,繼續修改首頁模板的導航部分,以便顯示使用者名稱及相應資訊:

{%extends "bootstrap/base.html "%}{% block title%}牛部落格 {% endblock %}<!--覆蓋title標籤-->{% block navbar %}<nav class="navbar navbar-inverse"><!-- 導航部分 -->  <div class="navbar-header">      <a class="navbar-brand" href="#">        牛部落格      </a>  </div>  <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">      <ul class="nav navbar-nav">        <li><a href="/">首頁</a></li>      </ul>      <ul class="nav navbar-nav navbar-right">        {% if current_user.is_authenticated %}            <li><p class="navbar-text"><a href="#" class="navbar-link">{{current_user.username}}</a>  您好</p></li>            <li><a href="{{url_for(‘logout‘)}}">登出</a></li>        {% else %}            <li><a href="{{url_for(‘login‘)}}">登入</a></li>        {% endif %}      </ul>    </div><!-- /.navbar-collapse --></nav>{% endblock %}{% block content %} <!--具體內容--><div class="container"></div>{% endblock %}

這裡新出現url_for方法,它的主要功能是使用程式中的資訊產生URL,比如傳入視圖的方法名,產生對應的url,還可以通過方法的動態參數產生url的參數,如url_for(‘index‘,age=5)結果為/?age=5

主要內容為判斷是否登入,若登入顯示 {{使用者名稱}}你好,並提供登出功能,否則顯示登入連結。

修改登入表單:

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)

其中login_user為flask_login外掛程式提供,用於設定使用者登入,其中第二個參數即為記住我選項,若輸入True,則提供cookie儲存狀態,否則關閉瀏覽器狀態即取消

新增登出方法:

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

此方法很簡單,直接使用flask-login提供的登出方法即可,注意@login_required裝飾器表示,只有登入使用者才可訪問此視圖方法。

運行測試一下,輸入首頁地址:

點擊右上方的登入鍵:

輸入使用者名稱zhangji 密碼123 並選擇記住我,點擊確定:

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

注意紅線部分,回到初始狀態。

章節結語

接下來本來應該是發帖及關注功能,但很明顯,現在代碼都在default.py中,對於代碼結構越來越力不從心,所以本章的篇幅比較小,下一章將重點對已有代碼進行重構,並對功能進行分組,然後在繼續寫接下來的功能。謝謝觀看。

一個web應用的誕生(6)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.