Python. Библиотека flask-sqlalchemy. Часть 2

Начало — Python. Библиотека flask-sqlalchemy. Часть 1

3. Модуль регистрации

Сделаем простой модуль — заполняется форма, данные посылается на сервер, если нет замечаний, то пользователь зарегистрирован без использования электронной почты.

Предварительно подготовим шаблоны в папке template.

base.html — здесь, если надо, подключаем фреймворки

<html>
  <head>
    {% if title %}
    <title>{{title}} </title>
    {% else %}
    <title>Наши новости</title>
    {% endif %}
  </head>
  <body>
    {% block content %}{% endblock %}  </body>
</html>

reg.html — хранит форму для регистрации, использует base.html

{% extends "base.html" %}

{% block content %}
<h2>Регистрация</h2>

<form action="" method="post">
    {{ form.hidden_tag() }}
    {{ form.csrf_token }}
    <p>
        {{ form.name.label }}<br>
        {{ form.name(class="form-control") }}<br>
        {% for error in form.name.errors %}
    <p class="alert alert-danger" role="alert">
        {{ error }}
    </p>
    {% endfor %}
    </p>
 
   <p>
        {{ form.email.label }}<br>
        {{ form.email(class="form-control", type="email") }}<br>
        {% for error in form.email.errors %}
    <p class="alert alert-danger" role="alert">
        {{ error }}
    </p>
    {% endfor %}
    </p>
    <p>
        {{ form.password.label }}<br>
        {{ form.password(class="form-control", type="password") }}<br>
        {% for error in form.password.errors %}
    <p class="alert alert-danger" role="alert">
        {{ error }}
    </p>
    {% endfor %}
    </p>
    <p>
        {{ form.password_again.label }}<br>
        {{ form.password_again(class="form-control", type="password") }}<br>
        {% for error in form.password_again.errors %}
    <p class="alert alert-danger" role="alert">
        {{ error }}
    </p>
    {% endfor %}
    </p>
    <p>{{ form.submit(type="submit", class="btn btn-primary") }}</p>
    {{message}}
</form>
{% endblock %}

list.ru — для вывода списка зарегистрированных пользователей. Добавлена ссылка для перехода на регистрацию

{% extends "base.html" %}
{% block content %}
<a href = "/reg">Зарегистрироваться</a>
<h2>Список зарегистрированных пользователей</h2>
{% for user in users %}
     <p>{{user.name}}: <i>{{user.email}}</i></p>
     {% endfor %}

{% endblock %}

<!-- Не обрабатываю ситуацию, когда нет записей -->

news.php — главная страница, вывод новостей, в дальнейшем этот шаблон еще будет дополнен

{% extends "base.html" %}

{% block content %}
<a href = "/list"> Список пользователей</a> <a href = "/reg">Регистрация </a>

<h2>Статьи</h2>
{% for post in posts %}
     <h3>{{post.title}}: </h3> <p>{{post.short_text}}</p>
     {% endfor %}

{% endblock %}

После подготовки шаблонов главный файл main.py имеет следующий вид

from flask import Flask, render_template, redirect
from data import db_session # Грузим из нашей папки data
from data.reg import RegForm
from data.users import User
from data.news import News


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


def main():
    db_session.global_init("db/news.sqlite") # При первом запуске будет создан файл news.sqlite

    @app.route('/')
    def index():
        session = db_session.create_session()
        posts = session.query(News)
        return render_template('news.html', title='Новости', posts=posts)


    @app.route('/index')
    def index1():
        return redirect('/')

    
    @app.route('/list')
    def list():
        session = db_session.create_session()
        #session.query(User).delete()   #Убрать комментарий в двух строках
        #session.commit()               # и будет очищаться таблица
        users = session.query(User)
        return render_template('list.html', title='Список авторов', users=users)

    @app.route('/reg', methods=['GET', 'POST'])
    def register():
        form = RegForm()
        if form.validate_on_submit():
            if form.password.data != form.password_again.data:
                return render_template('reg.html', title='Регистрация', form=form,
                                       message="Пароли не совпадают")
            session = db_session.create_session()
            if session.query(User).filter(User.email == form.email.data).first():
                return render_template('reg.html', title='Регистрация', form=form,
                                       message="Такой пользователь уже существует")
            user = User(
                name=form.name.data,
                email=form.email.data
            )
            user.set_password(form.password.data)
            #print(user)
            session.add(user)
            session.commit()
            return redirect('/')
        return render_template('reg.html', title='Регистрация', form=form)

    app.run(port=8080, host='127.0.0.1')
  
    
    

if __name__ == '__main__':
    main()

Замечание. Это еще не конец. В самом-самом конце я выложу все файлы проекта. И если я что-то пропущу в промежуточных фалах, в конце все увидите.

Поделиться:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • LiveJournal
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • StumbleUpon
  • Technorati
  • БобрДобр
  • Memori.ru
  • МоёМесто.ru

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.