Flask+MySql实现用户登录注册
项目使用插件:
flask_bootstrap
flask_wtf
flask_login
flask_sqlalchemy
用户模型类:
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : /8/1 14:45# @File : Model.py"""数据模型"""from flask_login import LoginManager,login_user,UserMixin,logout_user,login_requiredfrom Start import login_mangerfrom Start import dbclass 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=nameself.pwd=pwddef get_id(self):return unicode(self.id)def __repr__(self):return '<User %r>' % self.namedef is_authenticated(self):return Truedef is_active(self):return Truedef is_anonymous(self):return False
表单类:
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : /8/1 14:46# @File : Form.py"""表单类"""from wtforms import StringField,SubmitField,PasswordFieldfrom wtforms.validators import Requiredfrom 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 : /8/1 14:45# @File : Views.py"""视图模型"""from flask import render_template,Blueprint,redirect,url_for,flashfrom Start import login_mangerfrom Form import Login_Form,Register_Formfrom Model import Usersfrom flask_login import LoginManager,login_user,UserMixin,logout_user,login_requiredfrom DB import dbblog=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_requireddef 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)mit()flash('注册成功')return redirect(url_for('blog.index'))return render_template('register.html',form=form)
项目启动类:
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : /8/1 14:50# @File : Start.py"""应用启动类"""from flask import Flask,render_template,flash,url_for,redirect,Blueprintfrom flask_bootstrap import Bootstrapfrom flask_moment import Momentfrom flask_wtf import FlaskFormfrom flask_login import LoginManager,login_user,UserMixin,logout_user,login_requiredfrom flask_sqlalchemy import SQLAlchemyimport sys#解决flash的一个bugdefaultencoding = '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:1996112lin@localhost/mydata'#配置数据库app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=Truedb = 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_loaderdef load_user(user_id):from Model import Usersreturn Users.query.get(int(user_id))"""蓝图注册"""def init():from Views import blogapp.register_blueprint(blueprint=blog,url_prefix='/blog')if __name__ == '__main__':init()app.run(port=6626,debug=True)
本例使用了Jinja2模板进行渲染
基础类模板:
{% extends "bootstrap/base.html" %}{% block title %}Flasky{% endblock %}{% block head %}{{ super() }}<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/x-icon"><link rel="icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/x-icon">{% endblock %}{% block navbar %}<div class="navbar navbar-inverse" role="navigation"><div class="container"><div class="navbar-header"><button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="/">Flasky</a></div><div class="navbar-collapse collapse"><ul class="nav navbar-nav"><li><a href="/">Home</a></li></ul><ul class="nav navbar-nav navbar-right">{% if current_user.is_authenticated %}<li><a href="{{ url_for('blog.logout') }}">Log Out</a></li>{% else %}<li><a href="blog.index">Log In</a></li>{% endif %}</ul><ul class="nav navbar-nav navbar-right"><li><a href="{{ url_for('blog.register') }}">Register in</a></li></ul></div></div></div>{% endblock %}{% block content %}<div class="container">{% for message in get_flashed_messages() %}<div class="alert alert-warning"><button type="button" class="close" data-dismiss="alert">×</button>{{ message }}</div>{% endfor %}{% block page_content %}{% endblock %}</div>{% 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 %}<div class="page-header"><h1>Login</h1></div><form action="/blog/login" method="post">{{ wtf.quick_form(form) }}</form>{% endblock %}
注册模板:
{% extends "form_base.html" %}{% import "bootstrap/wtf.html" as wtf %}{% block title %}Flasky{% endblock %}{% block page_content %}<div class="page-header"><h1>Register</h1></div><form action="/blog/register" method="post">{{ wtf.quick_form(form) }}</form>{% endblock %}
登录后模板:
<!DOCTYPE html>{% extends 'form_base.html' %}<html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body>{% block page_content %}<div class="page-header"><h1>Hello,{{ name }}</h1></div>{% endblock %}</body></html>