我正在學習使用燒瓶登錄來上課。這是一個介紹類,我們沒有在這個練習中使用資料庫,而是將憑據(散列)存盤在一個 resing 檔案中。我能夠驗證用戶憑據,但是當用戶“成功”登錄時,我不會重定向到受保護的 URL,而是重定向到登錄頁面。代碼:用戶模型:
class User(UserMixin):
def __repr__(self):
return '<User{}>'.format(self)
def __init__(self):
self.username = None
self.email = None
self.password = None
self.user_id = None
def get_id(self):
return self.user_id
登錄管理器:
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"
@login_manager.user_loader
def load_user():
return User
簽到部分:
user = User()
login_user(user)
return redirect(url_for('main'))
在我閱讀的所有教程中,都使用了 sql db。由于我們沒有使用它,并且由于我根本不需要登錄用戶是特定的 - 只是為了通過身份驗證,所以我正在閱讀的很多內容在引數中是不可行的。
uj5u.com熱心網友回復:
你在定義用戶加載器時忘記了一些東西。該函式接受一個user_id引數并回傳一個用戶類的物件,而不是類本身。(見檔案)
下面的簡化示例向您展示了在不使用資料庫的情況下實作的可能性。
基本上,flask-login 將用戶物件的屬性 id 存盤在會話 cookie 中。基于這個 id,資料庫中的 LoginManager 會查詢相應的用戶,這里已經用類變數 /list 替換了users。
資料庫實作通常有一個 id 列,該列被定義為條目唯一。在示例中,使用物件的唯一 id作為替代。這意味著 mixin 的 getter 將被覆寫。因此,該示例保留了已創建用戶物件的串列。在這些用戶中,可以通過他們的 id 或用戶名找到。
燒瓶(app.py)
from flask import (
Flask,
redirect,
render_template,
request,
url_for
)
from flask_login import (
LoginManager,
UserMixin,
login_required,
login_user,
logout_user
)
class User(UserMixin):
def __init__(self, username, password):
self.username = username
self.password = password
self.__class__.users.append(self)
def get_id(self):
return id(self)
users = []
@classmethod
def get(cls, user_id):
for usr in cls.users:
if usr.get_id() == user_id:
return usr
return None
@classmethod
def find_by_username(cls, username):
for usr in cls.users:
if usr.username == username:
return usr
return None
app = Flask(__name__)
app.secret_key = 'your secret here'
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
@login_manager.user_loader
def load_user(user_id):
return User.get(user_id)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
keys = ('username', 'password')
if request.method == 'POST' and all(k in request.form for k in keys):
username = request.form['username']
password = request.form['password']
if User.find_by_username(username) is None:
User(username, password)
return redirect(url_for('.login'))
return render_template('register.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
user = User.find_by_username(username)
if user and user.password == password:
login_user(user)
return redirect(request.args.get('next', url_for('.index')))
return render_template('login.html')
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('.index'))
@app.route('/secret')
@login_required
def secret():
return 'You found the secret.'
HTML (模板/index.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Index</title>
</head>
<body>
{% if current_user.is_authenticated -%}
<a href="{{ url_for('logout') }}">Logout</a>
{% else -%}
<a href="{{ url_for('register') }}">Register</a> |
<a href="{{ url_for('login') }}">Login</a>
{% endif -%}
<h1>Index</h1>
{% if current_user.is_authenticated -%}
Welcome {{ current_user.username }}!
{% else -%}
Welcome Guest!
{% endif -%}
</body>
</html>
HTML (模板/login.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Login</title>
</head>
<body>
<a href="{{ url_for('register') }}">Register</a>
<h1>Login</h1>
<form method="post">
<input type="text" name="username" placeholder="username" />
<input type="password" name="password" placeholder="password" />
<input type="submit" />
</form>
</body>
</html>
HTML (模板/register.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Register</title>
</head>
<body>
<h1>Register</h1>
<form method="post">
<input type="text" name="username" placeholder="username" />
<input type="password" name="password" placeholder="password" />
<input type="submit" />
</form>
</body>
</html>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/432451.html
上一篇:無法在heroku中生成視頻輸出
下一篇:如何在燒瓶中一起賦予獨特性?
