Задать вопрос
@hardwellZero

Что не так с регистрацией Flask?

Очередной вопрос по регистрации на Flask.
Пытаюсь написать регистрацию используя Flask, jinja2, WTForms, SQLAlchemy.
За основу взят код из статьи на хабре, где авторизация происходит через OpenID.
Нужна помощь. Довести это все до ума, бо моих знаний не хватает, а бессмысленное ковыряние в коде ни к чему не приведет. ВАЖНО! Не прошу написать все за меня, прошу доходчиво объяснить. Я здесь, что-бы понять и сделать, а не ради кусков кода. Спасибо за внимание.
views.py
@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        return redirect('/index')
    return render_template('login.html',
                           title='Sign In',
                           form=form)


forms.py
from flask.ext.wtf import Form
from wtforms import StringField, BooleanField, PasswordField
from wtforms.validators import DataRequired
class LoginForm(Form):
    username = StringField('username', validators=[DataRequired()])
    password = PasswordField('password', validators=[DataRequired()])

login.html
<form method="POST" action="/login">
        <div>{{ form.username.label }}: {{ form.username(class="css_class") }}</div>
        {% if form.username.errors %}
            <ul class="errors">{% for error in form.username.errors %}<li>{{ error }}</li>{% endfor %}</ul>
        {% endif %}

        <div>{{ form.password.label }}: {{ form.password() }}</div>
        {% if form.password.errors %}
            <ul class="errors">{% for error in form.password.errors %}<li>{{ error }}</li>{% endfor %}</ul>
        {% endif %}
        <input type="submit" value="Go">
    </form>

models.py
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nickname = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    posts = db.relationship('Post', backref='author', lazy='dynamic')

    def __repr__(self):
        return '<User %r>' % (self.nickname)
  • Вопрос задан
  • 2907 просмотров
Подписаться 3 Оценить 2 комментария
Решения вопроса 1
GeraJet
@GeraJet
Anykey
Кратко, после проверки валидации берешь username и password из формы, делаешь запрос по ним в базу и если такой пользователь с таким паролем существует, применяешь метод login_user() из Flask-login
# -*- coding: utf-8 -*-
from flask import request, render_template, flash, g, session, redirect, url_for
from flask.ext.login import login_user, logout_user, current_user, login_required
from app import db
from app.models import User
from app.forms import LoginForm
    
@app.route('/', methods=['GET', 'POST'])
def index():
    form = LoginForm()
    if form.validate_on_submit():
        username = request.form['username']
        password = request.form['password']
        user = User.query.filter_by(username=username, password=password).first()
        if user is None:
            flash(u'Неверный логин или пароль', 'error')
            return redirect("/")
        login_user(user)
        return redirect("/")
    return render_template("main/main.html", 
        form = form)

@app.route('logout/')
def logout():
    logout_user()
    return redirect("/")

models.py
from app import db

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    username = db.Column(db.String(120), unique=True)
    password = db.Column(db.String(120))

    def __init__(self, name, username, password):
        self.name = name
        self.username = username
        self.password = password

    def is_authenticated(self):
        return True
	 
    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return unicode(self.id)

    def __repr__(self):
        return self.name

template
{% with messages = get_flashed_messages() %}
	{% if messages %}
	<div class="flash">
	{% for message in messages %}
	    {{ message }}
	{% endfor %}
	</div>
	{% endif %}
{% endwith %}

<form method="POST" action="/login">
    <div>{{ form.username.label }}: {{ form.username(class="css_class") }}</div>
    {% if form.username.errors %}
        <ul class="errors">{% for error in form.username.errors %}<li>{{ error }}</li>{% endfor %}</ul>
    {% endif %}

    <div>{{ form.password.label }}: {{ form.password() }}</div>
    {% if form.password.errors %}
        <ul class="errors">{% for error in form.password.errors %}<li>{{ error }}</li>{% endfor %}</ul>
    {% endif %}
    <input type="submit" value="Go">
</form>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы