Имеет ли Flask встроенную поддержку функций входа/выхода пользователя? Я нашел this add-on project, но кажется, что это дает части для создания собственной системы входа. Кажется, это не полная система.Реализация страницы входа с Flask
Я новичок в Flask, и я прихожу из Django, где все это встроено, поэтому я немного озадачиваюсь тем, что эта базовая функциональность отсутствует.
Используя некоторые неполные примеры, которые я нашел, я пытаюсь реализовать страницу индекса, перенаправляющую на страницу входа для анонимных пользователей, и после успешного входа в систему перенаправляет страницу на индексную страницу. Это то, что я в настоящее время внедрили как «привет мир», например Логин/выхода из системы:
#!/usr/bin/env python
import flask
from flask import Flask, Response, render_template
from flask.ext.login import LoginManager, UserMixin, login_required, login_user, logout_user
app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin):
# proxy for a database of users
user_database = {
"JohnDoe": ("JohnDoe", "John"),
"JaneDoe": ("JaneDoe", "Jane"),
}
def __init__(self, username, password):
self.id = username
self.password = password
@property
def name(self):
return self.id
@classmethod
def get(cls, id):
ret = cls.user_database.get(id)
if ret is not None:
return cls(*ret)
@login_manager.user_loader
def load_user(user_id):
return User.get(user_id)
@login_manager.request_loader
def load_user(request):
token = request.headers.get('Authorization')
if token is None:
token = request.args.get('token')
if token is not None:
username,password = token.split(":") # naive token
user_entry = User.get(username)
if (user_entry is not None):
user = User(user_entry[0],user_entry[1])
if (user.password == password):
return user
return None
@app.route("/",methods=["GET"])
@login_manager.request_loader
def index():
if load_user(flask.request):
return render_template('index.html')
else:
return flask.redirect(flask.url_for('login'))
#return Response(response="Hello World!",status=200)
@app.route('/login', methods=['GET', 'POST'])
def login():
if flask.request.method == 'GET':
return '''
<form action='login' method='POST'>
<input type='text' name='email' id='email' placeholder='email'></input>
<input type='password' name='pw' id='pw' placeholder='password'></input>
<input type='submit' name='submit'></input>
</form>
'''
email = flask.request.form['email']
user = User.get(email)
if user and flask.request.form['pw'] == user.password:
login_user(user)
return flask.redirect(flask.url_for('index'))
return 'Bad login'
@app.route("/logout")
@login_required
def logout():
logout_user()
return flask.redirect(flask.url_for('index'))
if __name__ == '__main__':
app.config["SECRET_KEY"] = "ITSASECRET"
app.run(port=5000, debug=True)
Однако, это не работает, потому что несмотря на то, что, кажется, успешно войти в систему, когда он перенаправляет на страницу индекса, он не может искать пользователя из сеанса и перенаправляет обратно на страницу входа в систему. Что я делаю не так?
Вам необходимо прочитать документацию для флажка-входа ... в вашем классе пользователя отсутствуют некоторые необходимые вещи (например, isAnonomous) –
Я не уверен, почему вы смущены тем, что auth не входит в Flask. [На веб-сайте] (http://flask.pocoo.org/) четко сказано: «Флакон - это микрокарандаш». Это не значит, что вы сильно запекли. См. Также http://flask.pocoo.org/docs/0.10/foreword/#what-does-micro-mean: «Многочисленные расширения обеспечивают интеграцию базы данных, проверку формы, обработку загрузки, различные технологии открытой аутентификации и многое другое ». – Chris