Рубрики
Без рубрики

Флэста вход в систему-регистрационная реализация

Это часть 2 серии Flask. Я объяснил, что такое API REST и реализация в колбе … Tagged With Python, Security, HTML, SQL.

  • Это часть 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) %}
  
{{ field.label }}
{{ field(**kwargs)|safe }} {% if field.errors %}
    {% for error in field.errors %}
  • {{ error }}
  • {% endfor %}
{% endif %}
{% endmacro %}
  • Теперь создайте наш index.html , Login.html и Register.html Внутри шаблоны каталог.

  • Поместите ниже код внутри index.html Анкет

{% extends "base.html" %}

{% block body %}

{% if session.logged_in %} Logout {% else %} Login Sign up {% endif %}

{% 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


{{ render_field(form.email, class="form-control") }} {{ render_field(form.password, class="form-control") }}

Create a New Account! {% endblock body %}
  • Здесь поле Render будет отображать электронную почту и пароль с помощью макрофункциональности Jinja2.
  • Теперь , Создать Register.html Анкет
{% extends "base.html" %}

{% block body %}

{% from "includes/formhelpers.html" import render_field %}

Register


{{ render_field(form.name, class="form-control") }} {{ render_field(form.username, class="form-control") }} {{ render_field(form.email, class="form-control") }} {{ render_field(form.password, class="form-control") }} {{ render_field(form.confirm, class="form-control") }}

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”