Tutorial : Sử dụng flask cho người mới bắt đầu ( Phần 5)
Bài đăng này đã không được cập nhật trong 8 năm
Phần tiếp này tôi sẽ cùng các bạn làm phần tạo user login cho ứng dụng post. để tạo phần login chúng ta sẽ sử dụng extensions Flask-Login và Flask-OpenID. Flask-login sẽ điều khiển logged in state và Flask-OpenID sẽ cung cấp authentication.
1.login
Đầu tiên configure file app/__init__.py
:
import os
from flask.ext.login import LoginManager
from flask.ext.openid import OpenID
from config import basedir
lm = LoginManager()
lm.init_app(app)
oid = OpenID(app, os.path.join(basedir, 'tmp'))
Trong model User
class (file app/models.py
):
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
nickname = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
posts = db.relationship('Post', backref='author', lazy='dynamic')
@property
def is_authenticated(self):
return True
@property
def is_active(self):
return True
@property
def is_anonymous(self):
return False
def get_id(self):
try:
return unicode(self.id) # python 2
except NameError:
return str(self.id) # python 3
def __repr__(self):
return '<User %r>' % (self.nickname)
Bây giờ chúng ta sẽ sử dụng Flask-Login and Flask-OpenID extensions. Sử dụng Flask-Login (file app/views.py
):
from flask import render_template, flash, redirect, session, url_for, request, g
from flask.ext.login import login_user, logout_user, current_user, login_required
from app import app, db, lm, oid
from .forms import LoginForm
from .models import User
@app.route('/login', methods=['GET', 'POST'])
@oid.loginhandler
def login():
if g.user is not None and g.user.is_authenticated:
return redirect(url_for('index'))
form = LoginForm()
if form.validate_on_submit():
session['remember_me'] = form.remember_me.data
return oid.try_login(form.openid.data, ask_for=['nickname', 'email'])
return render_template('login.html',
title='Sign In',
form=form,
providers=app.config['OPENID_PROVIDERS'])
Ở đây:
oid.loginhandler
cho Flask-OpenID biết rằng đây là hàm login.
g
là biến global được Flask lưu giữ và chia sẻ thông tin trong suốt vòng đời request.
url_for
là function chứa url flask sẽ redirect tới.
remember_me
kiểu boolean chứa trong flask session.
oid.try_login
sẽ gọi tới user authentication thông qua Flask-OpenID.
Ở đây OpenID authentication khi đồng bọ sẽ gọi tới oid.after_login
nếu authentication thành công. Bước tiếp chúng ta sẽ viết hàng oid.after_login
(file app/views.py
):
@oid.after_login
def after_login(resp):
if resp.email is None or resp.email == "":
flash('Invalid login. Please try again.')
return redirect(url_for('login'))
user = User.query.filter_by(email=resp.email).first()
if user is None:
nickname = resp.nickname
if nickname is None or nickname == "":
nickname = resp.email.split('@')[0]
user = User(nickname=nickname, email=resp.email)
db.session.add(user)
db.session.commit()
remember_me = False
if 'remember_me' in session:
remember_me = session['remember_me']
session.pop('remember_me', None)
login_user(user, remember = remember_me)
return redirect(request.args.get('next') or url_for('index'))
2.Logging out
Chúng ta sẽ tạo phần log out cho người dùng.
trong phần (app/views.py
):
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('index'))
Bây giờ chúng ta còn thiếu đường link trên thanh navigation trên base layout (file app/templates/base.html
):
<html>
<head>
{% if title %}
<title>{{ title }} - microblog</title>
{% else %}
<title>microblog</title>
{% endif %}
</head>
<body>
<div>Microblog:
<a href="{{ url_for('index') }}">Home</a>
{% if g.user.is_authenticated %}
| <a href="{{ url_for('logout') }}">Logout</a>
{% endif %}
</div>
<hr>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }} </li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</body>
</html>
Tổng kết
Chúng ta có đủ chức năng loggin. Trong bài viết tới tôi sẽ giới thiệu phần tạo profile và avatar cho user.
All rights reserved
Bình luận
Mình cũng đang nghiên cứu học Flask, bài viết bổ ích. Mong bạn chia sẽ thêm những bài viết hay.