Flask+MySqlユーザー登録を実現

8312 ワード

プロジェクトはプラグインを使用します.
flask_bootstrap
flask_wtf
flask_login
flask_sqlalchemy
ユーザーモデルクラス:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/8/1 14:45
# @File    : Model.py
"""
    

"""

from flask_login import LoginManager,login_user,UserMixin,logout_user,login_required
from Start import login_manger
from Start import db

class Users(UserMixin,db.Model):
    __tablename__ = 'py_user'#  mysql    
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, index=True)
    pwd = db.Column(db.String(64), unique=True, index=True)
    def __init__(self,name,pwd):
        self.name=name
        self.pwd=pwd
    def get_id(self):
        return unicode(self.id)

    def __repr__(self):
        return '' % self.name

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

フォームクラス:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/8/1 14:46
# @File    : Form.py
"""
   
"""

from wtforms import StringField,SubmitField,PasswordField
from wtforms.validators import  Required
from flask_wtf import FlaskForm

#    
class Login_Form(FlaskForm):
    name=StringField('name',validators=[Required()])
    pwd=PasswordField('pwd',validators=[Required()])
    submit=SubmitField('Login in')

#    
class Register_Form(FlaskForm):
    name=StringField('name',validators=[Required()])
    pwd=PasswordField('pwd',validators=[Required()])
    submit=SubmitField('register')

ビュークラス:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/8/1 14:45
# @File    : Views.py
"""
    
"""

from  flask import render_template,Blueprint,redirect,url_for,flash
from Start import login_manger
from Form import Login_Form,Register_Form
from Model import  Users
from flask_login import LoginManager,login_user,UserMixin,logout_user,login_required
from DB import db

blog=Blueprint('blog',__name__)  #  

@blog.route('/')
def index():
    form=Login_Form()
    return render_template('login.html',form=form)

@blog.route('/index')
def l_index():
    form = Login_Form()
    return render_template('login.html',form=form)

@blog.route('/login',methods=['GET','POST'])
def login():
        form=Login_Form()
        if form.validate_on_submit():
            user=Users.query.filter_by(name=form.name.data).first()
            if user is not  None and user.pwd==form.pwd.data:
                login_user(user)
                flash('    ')
                return  render_template('ok.html',name=form.name.data)
            else:
                flash('       ')
                return render_template('login.html',form=form)

#    
@blog.route('/logout')
@login_required
def logout():
    logout_user()
    flash('      ')
    return redirect(url_for('blog.index'))

@blog.route('/register',methods=['GET','POST'])
def register():
    form=Register_Form()
    if form.validate_on_submit():
        user=Users(name=form.name.data,pwd=form.pwd.data)
        db.session.add(user)
        db.session.commit()
        flash('    ')
        return redirect(url_for('blog.index'))
    return render_template('register.html',form=form)

プロジェクト起動クラス:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/8/1 14:50
# @File    : Start.py
"""
     
"""

from flask import Flask,render_template,flash,url_for,redirect,Blueprint
from flask_bootstrap import Bootstrap

from flask_moment import Moment
from flask_wtf import FlaskForm
from flask_login import LoginManager,login_user,UserMixin,logout_user,login_required
from flask_sqlalchemy import SQLAlchemy
import sys
#  flash   bug
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
    reload(sys)
    sys.setdefaultencoding(defaultencoding)

app = Flask(__name__)

#       
app.config['SECRET_KEY']='kkk'
app.config['SQLALCHEMY_DATABASE_URI'] ='mysql://root:*****@localhost/mydata'#     
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True
db = SQLAlchemy()
db.init_app(app)
bootstrap = Bootstrap(app)
moment=Moment(app)
login_manger=LoginManager()
login_manger.session_protection='strong'
login_manger.login_view='blog.login'
login_manger.init_app(app)

@login_manger.user_loader
def load_user(user_id):
    from Model import Users
    return Users.query.get(int(user_id))

"""
    
"""
def init():
    from Views import blog
    app.register_blueprint(blueprint=blog,url_prefix='/blog')

if __name__ == '__main__':
    init()
    app.run(port=6626,debug=True)

この例では、Jinja 2テンプレートを使用してレンダリングします.
ベースクラステンプレート:
{% extends "bootstrap/base.html" %}

{% block title %}Flasky{% endblock %}

{% block head %}
{{ super() }}


{% endblock %}

{% block navbar %}

{% endblock %}

{% block content %}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %} {% block page_content %}{% endblock %}
{% endblock %} {% block scripts %} {{ super() }} {{ moment.include_moment() }} {% endblock %}

ログインテンプレート:
{% extends "form_base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky{% endblock %}
{% block page_content %}


    
{{ wtf.quick_form(form) }}
{% endblock %}

登録テンプレート:
{% extends "form_base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky{% endblock %}
{% block page_content %}


    
{{ wtf.quick_form(form) }}
{% endblock %}

ログイン後のテンプレート:

{% extends 'form_base.html' %}


    
    Title



{% block page_content %}
    

{% endblock %}



起動後のアクセス:
http://127.0.0.1:6626/blog/