Когда в Flask хранится аутентификация пользователя?

#python #authentication #flask #flask-login

Вопрос:

Я создал эту форму:

 <html>
<body>
<div>
    <form action="{{ url_for('login') }}" method="POST">
          <div class="row">
            <div>
              <input id="email" name="email" type="email" class="validate">
              <label for="email">Email</label>
            </div>
          </div>

          <div class="row">
            <div>
              <input id="password" type="password" name="password" class="validate">
              <label for="password">Password</label>
            </div>
          </div>

          <button type="submit" id="login" >Login</button>
        <br>
    </form>
<div>
</body>
</html>
 

и у меня есть приложение Flask, которое используется HTTPBasicAuth для аутентификации.

 #!flask/bin/python
from flask import Flask, jsonify, abort, request, make_response, url_for
from flask import render_template
from flask_httpauth import HTTPBasicAuth

#Needs: pip install flask-httpauth

app = Flask(__name__)
auth = HTTPBasicAuth()

@app.route('/', methods=['GET','POST'])
@auth.login_required
def login():
    print('in login')
    print(request.values.get('email'), request.values.get('password'))
    templateToReturn = 'login.html'
    if request.method == 'POST':
        print('in post')
        username = request.values.get('email')
        password = request.values.get('password')
        if verify_password(username, password):
            print('password verified')
            templateToReturn = 'index.html'
    print('Curr user', auth.current_user())
    print('request: ', request.method)
    if request.method == 'GET' and auth.current_user():
        templateToReturn = 'index.html'
    return render_template(templateToReturn)

@app.route('/logout')
def logout():
    return render_template('logout.html')

@auth.verify_password
def verify_password(email, password):
    print('in verify pwd')
    return verifyAuthentication(email, password)
    
def verifyAuthentication(email, password):
    knownUsers = {'p1@gmail.com': 'pass', 
                  'p2@yahoo.com': 'pass'}
    authenticated = False
    if email in knownUsers:
        if knownUsers[email] == password:
            authenticated = True
    return authenticated
 

Когда я нажимаю submit кнопку формы, я попадаю в login() функцию. Но разве не должен быть какой-то способ, которым он должен идти на verify_password() функцию, потому что он украшен @auth.verify_password ?

Как именно и в какой части кода аутентификация пользователя регистрируется в Flask? Под этим я подразумеваю: когда @auth.login_required декоратор фактически разрешает выполнение соответствующих декорированных функций?

Даже официальная страница HTTPBasicAuth() не объяснила это примером HTML. Не мог бы кто-нибудь объяснить, пожалуйста, добавив в мой код.

Ответ №1:

Вы забыли добавить атрибут name в свой HTML-тег ввода, поэтому в идеале он должен быть —

  <input id="email" name="email" type="email" class="validate" />
 <input id="password" name="password" type="password" class="validate" />