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

Создание системы входа в систему пользователя с помощью колбы и фауны

Введение В этой статье я покажу, как построить систему входа в систему пользователя с Pyth … Tagged с помощью Python, Flask, Server, Fauna.

В этой статье я покажу, как создать систему входа в систему пользователя с помощью Python, Flask и Фауна Анкет Flask-это Python MicroFramework, которая используется для создания веб-приложений, в то время как FAUANA-это простая в использовании базу данных NOSQL Server.

Фауна предоставляет много функций, чтобы сделать свой процесс интеграции базы данных бесшовным. Я полюбил его нативную поддержку для функций GraphQL и облачных функций. Вы можете создать учетную запись на фауне здесь.

В этой статье мы будем создавать веб -приложение с 4 страницами:

  • Домашняя/целевая страница
  • Панель панели
  • Страница входа
  • Зарегистрированная страница

Для начала создайте папку и создайте следующие файлы app.py , Шаблоны/Dashboard.html , шаблоны/home.html , Шаблоны/Signin.html , Шаблоны/регистрация.html , .env . Структура вашего проекта должна выглядеть следующим образом:

Затем вам нужно установить необходимые зависимости, введите следующее в своем терминале:

pip install flask faunadb python-dotenv
pip freeze > requirements.txt

Чтобы создать простое приложение Flask для учебника, введите приведенный ниже код в app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
 return {
 'Message': 'Welcome to our app'
 }

if __name__ == '__main__':
 app.run()

Чтобы запустить код выше, сначала установите Flask_debug переменная к Верно Затем запустите приложение, используя команду ниже:

export FLASK_DEBUG=true # if you are using windows change export to set
flask run

Вы должны получить ответ, аналогичный изображению ниже в вашем терминале:

Нажмите на ссылку, и вы увидите следующее в своем браузере

Дай! Вы создали простое приложение Flask с несколькими строками кода.

Шаг 1: Создание базы данных фауны

Чтобы создать базу данных, перейдите к Панель панели Фауны , затем нажмите на Новая база данных и введите имя базы данных в приглашении

Шаг 2: Создание Fauna Secret Key

Мы будем использовать секретный ключ Фауны для связи с нашей базой данных. Чтобы сгенерировать секретную клавишу, нажмите кнопку «Безопасность» и нажмите на Новый ключ кнопка в вкладке «Безопасность».

Скопируйте свой секретный ключ и сохраните его в безопасности, вы не сможете увидеть его снова.

Шаг 3: Создание нашей коллекции фауны

Нажмите на Новая коллекция и введите имя коллекции в подсказке, в данном случае, мое имя коллекции – Пользователь Анкет

Шаг 4: Создание индекса для вашей коллекции

Перейти к Индексы Вкладка в левой части экрана и нажмите на Новый индекс кнопку и введите свои данные в подсказке, она должна выглядеть как на изображении ниже

Давайте начнем с реального приложения для этой статьи, наше приложение продемонстрирует, как аутентифицировать пользователей в приложении Flask.

В вашем файле .env введите следующее:

Шаг 1: Добавление ключей среды

FAUNA_SECRET='your fauna secret'
SECRET_KEY='your application secret key'

Шаг 2: Импорт зависимостей и определение домашнего маршрута

Давайте напишем представление о домашнем маршруте, обновите свой app.py Файл с кодом ниже:

import re
from flask import Flask, flash, redirect, url_for, render_template, request, session
from werkzeug.security import generate_password_hash, check_password_hash
from faunadb import query as q
from faunadb.client import FaunaClient
from faunadb.objects import Ref
from faunadb.errors import BadRequest, NotFound
from dotenv import load_dotenv
import os, secrets

app = Flask(__name__)
app.config['SECRET_KEY']=os.getenv('SECRET_KEY')

client = FaunaClient(secret=os.getenv('FAUNA_SECRET'))

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

Далее мы создаем наш home.html файл и добавьте следующее:


 
 
 
 Fauna-Login
 
 
 
 



 
 

 

 
{% with messages = get_flashed_messages(with_categories=True) %} {% if messages %} {% for category, message in messages %}
{{ message }}
{% endfor %} {% endif %} {% endwith %}

Hello there!

с Блок – это особенность Джинджа который представляет собой шаблонный двигатель. с Block здесь используется для прошивки сообщений пользователю, как сообщение о успехе регистрации, сообщение об ошибке от пользователя и т. Д. На сервере мы будем использовать функцию Flash в колбе, и если этот блок кода будет замечен, он отобразит ее в браузере, потому что мы добавили ее в наш файл HTML.

Если вы обновите страницу, вы должны увидеть изображение ниже. Обратите внимание, что кнопки для входа и регистрации еще не работают, так как мы еще не определили для них маршруты.

Шаг 3: Определение сигналов и регистрации маршруты

Давайте определим нашу конечную точку Signin и подписи, добавьте следующий код под домашней функцией в app.py файл

@app.route('/signin/', methods=['POST', 'GET'])
def signin():
    if session.get('user_id'):
            flash('You are logged in!', 'warning')
            return redirect(url_for('dashboard'))
    if request.method =='POST':
        # get the user details
        email = request.form['email']
        password = request.form['password']
        # verify if the user details exist
        try:
            user = client.query(
                    q.get(q.match(q.index('user_by_email'), email))
            )
        except NotFound:
            flash('Invalid email or password', category='warning')
        else:
            if check_password_hash(user['data']['password'], password):
                session['user_id'] = user['ref'].id()
                flash('Signed in successfully', 'success')
                return redirect(url_for('dashboard'))
            else:
                flash('Invalid email or password', 'warning')
    return render_template('signin.html')

@app.route('/signup/', methods=['POST', 'GET'])
def signup():
    if session.get('user_id'):
            flash('You are logged in!', 'warning')
            return redirect(url_for('dashboard'))
    if request.method =='POST':
        name = request.form['name']
        email = request.form['email']
        password = request.form['password']
        email_regex = '^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$'
        if not re.search(email_regex, email) or not 6 < len(password) < 20:
            flash('Invalid email or password!, password needs to be between 6 and 20 characters', 'warning')
            return render_template('signup.html')
        if password != request.form['confirm_password']:
            flash('password fields not equal', 'warning')
            return render_template('signup.html')
        password = generate_password_hash(password)
        user = {'name': name, 'email': email, 'password': password}
        try:
            # store user data to db
            new_user = client.query(q.create(
                q.collection('user'),
                {'data': user}
            ))
        except BadRequest:
            flash('Email already exists')
        else:
            session['user_id'] = new_user['ref'].id()
            flash('Account created successfully', 'success')
            return redirect(url_for('dashboard'))
    return render_template('signup.html')

Многое происходит здесь, маршрут Signin получает данные формы из файла signin.html и обрабатывает его. Сначала я добавляю Методы Аргумент по маршруту и добавить СООБЩЕНИЕ И Получить , это Получить по умолчанию. Затем я проверил, будет ли установлен сеанс пользователя, я подробно объясню это позже. Затем я также проверяю, отправляется ли запрос через запрос POST, если это так, то я получаю пользовательские данные и использую клиент -объект Fauna, чтобы проверить, существует ли пользователь с этим электронным письмом, если пользователь не существует, я прошучиваю сообщение об ошибке пользователю и перенаправить их обратно в конечную точку Signin, используя url_for и перенаправление Метод в колбе. Если пользователь существует, я использовал объект сеанса в Flask, чтобы войти в систему пользователя. Чтобы хранить объект сеанса, все, что мне нужно сделать является

session['name']=value

После хранения сеанса я перенаправил их на страницу панели панели. Кроме того, страница регистрации аналогична, за исключением того факта, что данные, которые мы извлечены из браузера, используются при создании новых данных. Я также подтвердил, что электронная почта уникальна, если оно не уникально, оно вынесет ошибку, с которой я обработал. Перед тем, как иметь дело с кодами фронтальных средств, было бы неплохо работать со всем кодом на стороне сервера, мы определим еще две конечные точки, а также обновим наш домашний маршрут.

Шаг 4: Определение приборной панели и подписания маршруты

@app.route('/dashboard/')
def dashboard():
    if not session.get('user_id'):
            flash('You need to be logged in to view this page!', 'warning')
            return redirect(url_for('signin'))
    user = client.query(
        q.get(q.ref(q.collection("user"), session['user_id']))
    )['data']
    return render_template('dashboard.html', current_user=user)

@app.route("/signout/")
def signout():
    if not session.get('user_id'):
        flash('You need to be logged in to do this!', 'warning')
    else:
        session.pop('user_id', None)
        flash('Signed out successfully', 'success')
    return redirect(url_for('home'))

В маршруте панели управления я сначала проверяю, не установлен ли сеанс user_id, что означает, что запрос неавторизован, если это условие верно, я перенаправлен обратно на маршрут Signin. Если сеанс установлен, я использовал переменную сеанса user_id для получения пользовательских данных, и я передал ее в html -файл, который рендерируется.

В маршруте регистрации я сначала проверяю, не установлен ли сеанс user_id, тогда я пропускаю сообщение пользователю, но если сеанс установлен, я удаляю его, и в любом случае, я перенаправляю их обратно на домашний маршрут. Я использовал Session.pop Функция, которая принимает имя мы из переменной, которую я хочу удалить из сеанса И я также не прохожу ни в одном

Отредактируйте домашний маршрут, чтобы быть похожим на то, что ниже:

app.route('/')
def home():
    if session.get('user_id'):
            flash('You are logged in!', 'warning')
            return redirect(url_for('dashboard'))
    return render_template('home.html')

Перед рендерингом файл home.html я сначала проверяю, будет ли установлен сеанс user_id, если он вписался, и я перенаправляю обратно на страницу панели панели.

Шаг 5: Создание HTML файлы

В вашем Signin.html Тип файла следующее:





    
    
    
    SignIn - Fauna-Login
    
    
    



    
    
  
  
{% with messages = get_flashed_messages(with_categories=True) %} {% if messages %} {% for category, message in messages %}
{{ message }}
{% endfor %} {% endif %} {% endwith %}

Sign In

Don't have an account? Signup

В вашем QUINUP.HTML тип файла следующее


    
    
    
    SignUp - Fauna-Login
    
    
    



    
    
  
  
{% with messages = get_flashed_messages(with_categories=True) %} {% if messages %} {% for category, message in messages %}
{{ message }}
{% endfor %} {% endif %} {% endwith %}

Sign In

Have an account? Login

В действии формы я использовал url_for которая является функцией колбы, которая принимает функцию представления и возвращает конечную точку, на которую реагирует функция представления. В качестве альтернативы я могу просто пройти конечную точку, как и в конце формы.

В вашем Dashboard.html Тип файла следующее:




  
    
    
    
    {{current_user.name}} - Fauna-Login
    
    
    



    
    
  
  
{% with messages = get_flashed_messages(with_categories=True) %} {% if messages %} {% for category, message in messages %}
{{ message }}
{% endfor %} {% endif %} {% endwith %}

Welcome {{current_user.name}}

Наконец, мы будем тестировать приложение. Во -первых, перейти к Домашний маршрут , вы должны увидеть следующее:

Нажмите кнопку «Зарегистрироваться» и попробуйте зарегистрироваться с помощью электронной почты и пароля, длина которых не составляет от 6 до 20 символов.

Таким образом, мы видим, что наши данные подтверждаются до создания данных. Далее создайте пользовательские данные.

Нажмите кнопку «Выход», вы получите классное сообщение успеха, и вы можете снова войти в систему.

Нажмите кнопку Signin и попробуйте войти в систему с созданными вами данными при регистрации.

Если ваши данные верны, вы сможете успешно войти в систему.

Давайте посмотрим на нашу панель пользовательской коллекции в Фауна

Как видите, данные правильно хранятся на приборной панели. Вы также можете запросить свои данные непосредственно в панели панели фауны, используя FQL.

В этой статье вы смогли создать веб -приложение, которое входит в систему пользователей, а также выпускает пользователей, используя две интересные технологии, колбу и фауну. Исходный код для этого проекта доступен на GitHub Если вы найдете эту статью интересной, пожалуйста, поделитесь ею с друзьями и коллегами. Вы можете связаться со мной через Twitter если у вас есть какие-нибудь вопросы.

Оригинал: “https://dev.to/bkoiki950/building-a-user-login-system-with-flask-and-faunadb-42pk”