Это часть 2 серии Flask. Я объяснил Что такое API REST и реализация в Flask Анкет Пожалуйста, обратитесь к этой статье для лучшего понимания API REST.
Сегодня мы собираемся реализовать поток для регистрации в логине в колбе. Так что без каких -либо дальнейших давай прыгнут в это. Вы можете проверить весь код на GitHub Repository Анкет
Прежде всего, мы установим зависимости, которые мы собираемся использовать, перечислены ниже.
Flask Web Application Поддержка SQLalchemy в вашем приложении Создать интерактивный пользовательский интерфейс ORM для нашего приложения Библиотека веб -приложений, она обеспечит безопасность для шифрования пароля и сопоставления пароля Библиотека проверки и генерации
Чтобы установить зависимости в вашем проекте, используйте команду PIP.
PIP установка <Библиотека имени>
- Теперь создайте каталог, названный как
Flask-Login-Register
Анкет Наша структура проекта подобна изображению ниже.
- Теперь мы создаем логин и регистрационные формы, используя
Wtforms
Анкет - Создать
forms.py
Файл внутри каталога.
# Importing Require Module from wtforms import Form, BooleanField, StringField, PasswordField, validators, TextAreaField, IntegerField from wtforms.validators import DataRequired # Creating Login Form contains email and password class LoginForm(Form): email = StringField("Email", validators=[validators.Length(min=7, max=50), validators.DataRequired(message="Please Fill This Field")]) password = PasswordField("Password", validators=[validators.DataRequired(message="Please Fill This Field")]) # Creating Registration Form contains username, name, email, password and confirm password. class RegisterForm(Form): name = StringField("Ad", validators=[validators.Length(min=3, max=25), validators.DataRequired(message="Please Fill This Field")]) username = StringField("Username", validators=[validators.Length(min=3, max=25), validators.DataRequired(message="Please Fill This Field")]) email = StringField("Email", validators=[validators.Email(message="Please enter a valid email address")]) password = PasswordField("Password", validators=[ validators.DataRequired(message="Please Fill This Field"), validators.EqualTo(fieldname="confirm", message="Your Passwords Do Not Match") ]) confirm = PasswordField("Confirm Password", validators=[validators.DataRequired(message="Please Fill This Field")])
Этот файл будет создавать формы, когда мы будем использовать шаблон Jinja2 для создания наших шаблонов. Здесь,
DataRequared
Функция бросит ошибку, если поле пустое.Для пароля и подтверждения пароля, которое мы использовали
Пароль
Функция и проверить этот пароль и подтвердить пароль, мы использовалиРавное
функцияДавайте сгенерируем нашу пользовательскую модель и конечные точки API. Для цели простоты я напишу весь код в одном файле.
Создать
app.py
Под каталогом и размещение ниже кода внутри файла.
# Importing require libraries from flask import Flask, render_template, flash, redirect, request, session, logging, url_for from flask_sqlalchemy import SQLAlchemy from forms import LoginForm, RegisterForm from werkzeug.security import generate_password_hash, check_password_hash # Now create flask application object app = Flask(__name__) # Database Configuration and Creating object of SQLAlchemy app.config['SECRET_KEY'] = '!9m@S-dThyIlW[pHQbN^' app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@localhost/auth' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) # Create User Model which contains id [Auto Generated], name, username, email and password class User(db.Model): __tablename__ = 'usertable' id = db.Column(db.Integer, primary_key=True) name= db.Column(db.String(15), unique=True) username = db.Column(db.String(15), unique=True) email = db.Column(db.String(50), unique=True) password = db.Column(db.String(256), unique=True)
- Теперь создайте наш первый маршрут, который сделает домашнюю страницу нашего веб -приложения Flask. Поместите ниже код внутри
app.py
Анкет
@app.route('/') def home(): return render_template('index.html')
Пришло время создать фактическую функциональность для нашего веб -приложения. В нашем случае это конечная точка для входа и регистрации.
Поместите ниже код внутри
app.py
. Он будет предоставлять функциональность использования пользователя.
# User Registration Api End Point @app.route('/register/', methods = ['GET', 'POST']) def register(): # Creating RegistrationForm class object form = RegisterForm(request.form) # Cheking that method is post and form is valid or not. if request.method == 'POST' and form.validate(): # if all is fine, generate hashed password hashed_password = generate_password_hash(form.password.data, method='sha256') # create new user model object new_user = User( name = form.name.data, username = form.username.data, email = form.email.data, password = hashed_password ) # saving user object into data base with hashed password db.session.add(new_user) db.session.commit() flash('You have successfully registered', 'success') # if registration successful, then redirecting to login Api return redirect(url_for('login')) else: # if method is Get, than render registration form return render_template('register.html', form = form)
Выше конечная точка API будет проверять, что метод http -запроса является get, чем форма регистрации рендеринга, но если метод запроса HTTP будет опубликовано, то он проверит эту форму действительную или нет, если форма действителен, он будет генерировать хэш -пароль из пароля и и Создайте новый пользовательский объект с этим паролем, а затем он сохранит этот объект в базе данных.
Здесь, чтобы заметить это, нам не нужно проверять этот пароль, и подтверждать, как пароль – это то же самое или нет, сделав вход в систему, мы проверили это в нашем классе генерации регистрации.
Теперь давайте создадим наши API входа в систему и выходе из системы. Поместите ниже код внутри
app.py
файл.
# Login API endpoint implementation @app.route('/login/', methods = ['GET', 'POST']) def login(): # Creating Login form object form = LoginForm(request.form) # verifying that method is post and form is valid if request.method == 'POST' and form.validate: # checking that user is exist or not by email user = User.query.filter_by(email = form.email.data).first() if user: # if user exist in database than we will compare our database hased password and password come from login form if check_password_hash(user.password, form.password.data): # if password is matched, allow user to access and save email and username inside the session flash('You have successfully logged in.', "success") session['logged_in'] = True session['email'] = user.email session['username'] = user.username # After successful login, redirecting to home page return redirect(url_for('home')) else: # if password is in correct , redirect to login page flash('Username or Password Incorrect', "Danger") return redirect(url_for('login')) # rendering login page return render_template('login.html', form = form)
Здесь, если метод является допустимым способом, и форма действителен, то он будет искать пользователя в базе данных с помощью электронной почты пользователя. Если пользователь существует, то он будет сравнивать хэшированный пароль, который хранится в базе данных, и простой пароль, который вводится пользователем.
Если оба пароля соответствуют, позвольте пользователю получить доступ и перенаправить пользователя на
Главная
Сохраняя имя пользователя и электронную почту внутри сеанса.Давайте напишем нашу последнюю логику бэкэнд для API входа в систему и запуска сервера. Напишите ниже код внутри
app.py
Анкет
@app.route('/logout/') def logout(): # Removing data from session by setting logged_flag to False. session['logged_in'] = False # redirecting to home page return redirect(url_for('home')) if __name__ == '__main__': # Creating database tables db.create_all() # running server app.run(debug=True)
Теперь давайте сделаем наши шаблоны фронта и статичны.
Создать
Шаблоны
каталог внутриFlask-Login-Register
каталог.Давайте создадим наш файл макета с именем как
base.html
Внутри каталога шаблонов. Это обеспечит базовый макет для нашего передней части.
Flask {% block body %} {% endblock body %}
Создать
Включает
каталог Внутри нашегошаблоны
каталог и создатьFormhelpers.html
ВнутриВключает
каталог.FormHelpers.html
Использует функциональность Jinja2 Macros, благодаря этому мы можем динамически отображать наши сообщения об ошибках и успеха и HTML -поля. Напишите ниже HTML -код внутриFormhelpers.html
.
{% macro render_field(field) %}
-
{% for error in field.errors %}
- {{ error }} {% endfor %}
Теперь создайте наш
index.html
,Login.html
иRegister.html
Внутришаблоны
каталог.Поместите ниже код внутри
index.html
Анкет
{% extends "base.html" %} {% block body %}
{% if session['logged_in'] %}Welcome, {{session['username'] }}
{% endif %} {% endblock body %}
- В вышеуказанном коде он проверит на наличие
logged_in
флаг. Это верно, чем будет отображаться в журнале на Navbar, и если он ложный, то он будет отображать вход и регистрацию на Navbar.
- Теперь создайте
Login.html
файл.
{% extends "base.html" %} {% block body %} {% from "includes/formhelpers.html" import render_field %}Login
Create a New Account! {% endblock body %}
- Здесь поле Render будет отображать электронную почту и пароль с помощью макрофункциональности Jinja2.
- Теперь , Создать
Register.html
Анкет
{% extends "base.html" %} {% block body %} {% from "includes/formhelpers.html" import render_field %}Register
Login into existing account! {% endblock body %}
- Теперь давайте создадим простую навигационную строку для проекта Out, применяя CSS в класс.
- Создать
Статический
Режиссер внутриFlask-Login-Register
и создатьmain.css
файл. Нашmain.css
Файл будет выглядеть ниже.
/* Add a black background color to the top navigation */ .topnav { background-color: #172944; overflow: hidden; } /* Style the links inside the navigation bar */ .topnav a { float: left; color: #f2f2f2; text-align: center; padding: 14px 16px; text-decoration: none; font-size: 17px; } /* Change the color of links on hover */ .topnav a:hover { background-color: #ddd; color: black; } /* Add a color to the active/current link */ .topnav a.active { background-color: #4CAF50; color: white; }
Здесь. Наш поток регистрации входа завершен.
Давайте запустим наш проект.
Чтобы запустить проект в Windows, используйте ниже команду внутри
Flask-Login-Register
Путь командной строки.
set FLASK_APP=app.py set FLASK_DEBUG=1 flask run --port=8080
- Запуск проекта в MacOS/Linux Использование ниже команды в команде
Flask-Login-Register
Путь терминала.
export FLASK_APP=app.py export FLASK_DEBUG=1 flask run --port=8080
Здесь,
-порт
это необязательный флаг.В следующем посте я объясню, что такое JWT, и внедряйте JWT Flask.
Спасибо за чтение. Дайте как и следуйте за мной за более удивительными учебными пособиями.
Оригинал: “https://dev.to/imdhruv99/flask-login-register-logout-implementation-3hep”