В этой статье я покажу, как создать систему входа в систему пользователя с помощью 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
В вашем 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
В действии формы я использовал 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”