Flask+MySql实现用户登录注册

Flask+MySql实现用户登录注册

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Coder_py/article/details/76572808

Flask+MySql实现用户登录注册

项目使用插件:

flask_bootstrap

flask_wtf

flask_login

flask_sqlalchemy

用户模型类:

  1.  
    #!/usr/bin/env python
  2.  
    # -*- coding: utf-8 -*-
  3.  
    # @Time : 2017/8/1 14:45
  4.  
    # @File : Model.py
  5.  
    """
  6.  
    数据模型
  7.  
     
  8.  
    """
  9.  
     
  10.  
     
  11.  
    from flask_login import LoginManager,login_user,UserMixin,logout_user,login_required
  12.  
    from Start import login_manger
  13.  
    from Start import db
  14.  
     
  15.  
    class Users(UserMixin,db.Model):
  16.  
    __tablename__ = 'py_user'#对应mysql数据库表
  17.  
    id = db.Column(db.Integer, primary_key=True)
  18.  
    name = db.Column(db.String(64), unique=True, index=True)
  19.  
    pwd = db.Column(db.String(64), unique=True, index=True)
  20.  
    def __init__(self,name,pwd):
  21.  
    self.name=name
  22.  
    self.pwd=pwd
  23.  
    def get_id(self):
  24.  
    return unicode(self.id)
  25.  
     
  26.  
    def __repr__(self):
  27.  
    return '<User %r>' % self.name
  28.  
     
  29.  
    def is_authenticated(self):
  30.  
    return True
  31.  
     
  32.  
    def is_active(self):
  33.  
    return True
  34.  
     
  35.  
    def is_anonymous(self):
  36.  
    return False

表单类:

  1.  
    #!/usr/bin/env python
  2.  
    # -*- coding: utf-8 -*-
  3.  
    # @Time : 2017/8/1 14:46
  4.  
    # @File : Form.py
  5.  
    """
  6.  
    表单类
  7.  
    """
  8.  
     
  9.  
    from wtforms import StringField,SubmitField,PasswordField
  10.  
    from wtforms.validators import Required
  11.  
    from flask_wtf import FlaskForm
  12.  
     
  13.  
    #登录表单
  14.  
    class Login_Form(FlaskForm):
  15.  
    name=StringField('name',validators=[Required()])
  16.  
    pwd=PasswordField('pwd',validators=[Required()])
  17.  
    submit=SubmitField('Login in')
  18.  
     
  19.  
     
  20.  
    #注册表单
  21.  
    class Register_Form(FlaskForm):
  22.  
    name=StringField('name',validators=[Required()])
  23.  
    pwd=PasswordField('pwd',validators=[Required()])
  24.  
    submit=SubmitField('register')

视图类:

  1.  
    #!/usr/bin/env python
  2.  
    # -*- coding: utf-8 -*-
  3.  
    # @Time : 2017/8/1 14:45
  4.  
    # @File : Views.py
  5.  
    """
  6.  
    视图模型
  7.  
    """
  8.  
     
  9.  
    from flask import render_template,Blueprint,redirect,url_for,flash
  10.  
    from Start import login_manger
  11.  
    from Form import Login_Form,Register_Form
  12.  
    from Model import Users
  13.  
    from flask_login import LoginManager,login_user,UserMixin,logout_user,login_required
  14.  
    from DB import db
  15.  
     
  16.  
    blog=Blueprint('blog',__name__) #蓝图
  17.  
     
  18.  
    @blog.route('/')
  19.  
    def index():
  20.  
    form=Login_Form()
  21.  
    return render_template('login.html',form=form)
  22.  
     
  23.  
    @blog.route('/index')
  24.  
    def l_index():
  25.  
    form = Login_Form()
  26.  
    return render_template('login.html',form=form)
  27.  
     
  28.  
    @blog.route('/login',methods=['GET','POST'])
  29.  
    def login():
  30.  
    form=Login_Form()
  31.  
    if form.validate_on_submit():
  32.  
    user=Users.query.filter_by(name=form.name.data).first()
  33.  
    if user is not None and user.pwd==form.pwd.data:
  34.  
    login_user(user)
  35.  
    flash('登录成功')
  36.  
    return render_template('ok.html',name=form.name.data)
  37.  
    else:
  38.  
    flash('用户或密码错误')
  39.  
    return render_template('login.html',form=form)
  40.  
     
  41.  
    #用户登出
  42.  
    @blog.route('/logout')
  43.  
    @login_required
  44.  
    def logout():
  45.  
    logout_user()
  46.  
    flash('你已退出登录')
  47.  
    return redirect(url_for('blog.index'))
  48.  
     
  49.  
     
  50.  
    @blog.route('/register',methods=['GET','POST'])
  51.  
    def register():
  52.  
    form=Register_Form()
  53.  
    if form.validate_on_submit():
  54.  
    user=Users(name=form.name.data,pwd=form.pwd.data)
  55.  
    db.session.add(user)
  56.  
    db.session.commit()
  57.  
    flash('注册成功')
  58.  
    return redirect(url_for('blog.index'))
  59.  
    return render_template('register.html',form=form)

项目启动类:

  1.  
    #!/usr/bin/env python
  2.  
    # -*- coding: utf-8 -*-
  3.  
    # @Time : 2017/8/1 14:50
  4.  
    # @File : Start.py
  5.  
    """
  6.  
    应用启动类
  7.  
    """
  8.  
     
  9.  
     
  10.  
     
  11.  
    from flask import Flask,render_template,flash,url_for,redirect,Blueprint
  12.  
    from flask_bootstrap import Bootstrap
  13.  
     
  14.  
    from flask_moment import Moment
  15.  
    from flask_wtf import FlaskForm
  16.  
    from flask_login import LoginManager,login_user,UserMixin,logout_user,login_required
  17.  
    from flask_sqlalchemy import SQLAlchemy
  18.  
    import sys
  19.  
    #解决flash的一个bug
  20.  
    defaultencoding = 'utf-8'
  21.  
    if sys.getdefaultencoding() != defaultencoding:
  22.  
    reload(sys)
  23.  
    sys.setdefaultencoding(defaultencoding)
  24.  
     
  25.  
     
  26.  
    app = Flask(__name__)
  27.  
     
  28.  
    #各项插件的配置
  29.  
    app.config['SECRET_KEY']='kkk'
  30.  
    app.config['SQLALCHEMY_DATABASE_URI'] ='mysql://root:1996112lin@localhost/mydata'#配置数据库
  31.  
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True
  32.  
    db = SQLAlchemy()
  33.  
    db.init_app(app)
  34.  
    bootstrap = Bootstrap(app)
  35.  
    moment=Moment(app)
  36.  
    login_manger=LoginManager()
  37.  
    login_manger.session_protection='strong'
  38.  
    login_manger.login_view='blog.login'
  39.  
    login_manger.init_app(app)
  40.  
     
  41.  
    @login_manger.user_loader
  42.  
    def load_user(user_id):
  43.  
    from Model import Users
  44.  
    return Users.query.get(int(user_id))
  45.  
     
  46.  
    """
  47.  
    蓝图注册
  48.  
    """
  49.  
    def init():
  50.  
    from Views import blog
  51.  
    app.register_blueprint(blueprint=blog,url_prefix='/blog')
  52.  
     
  53.  
     
  54.  
    if __name__ == '__main__':
  55.  
    init()
  56.  
    app.run(port=6626,debug=True)

本例使用了Jinja2模板进行渲染

基础类模板:

  1.  
    {% extends "bootstrap/base.html" %}
  2.  
     
  3.  
    {% block title %}Flasky{% endblock %}
  4.  
     
  5.  
    {% block head %}
  6.  
    {{ super() }}
  7.  
    <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/x-icon">
  8.  
    <link rel="icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/x-icon">
  9.  
    {% endblock %}
  10.  
     
  11.  
    {% block navbar %}
  12.  
    <div class="navbar navbar-inverse" role="navigation">
  13.  
    <div class="container">
  14.  
    <div class="navbar-header">
  15.  
    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
  16.  
    <span class="sr-only">Toggle navigation</span>
  17.  
    <span class="icon-bar"></span>
  18.  
    <span class="icon-bar"></span>
  19.  
    <span class="icon-bar"></span>
  20.  
    </button>
  21.  
    <a class="navbar-brand" href="/">Flasky</a>
  22.  
    </div>
  23.  
    <div class="navbar-collapse collapse">
  24.  
    <ul class="nav navbar-nav">
  25.  
    <li><a href="/">Home</a></li>
  26.  
    </ul>
  27.  
     
  28.  
    <ul class="nav navbar-nav navbar-right">
  29.  
    {% if current_user.is_authenticated %}
  30.  
    <li><a href="{{ url_for('blog.logout') }}">Log Out</a></li>
  31.  
    {% else %}
  32.  
    <li><a href="blog.index">Log In</a></li>
  33.  
    {% endif %}
  34.  
    </ul>
  35.  
    <ul class="nav navbar-nav navbar-right">
  36.  
    <li><a href="{{ url_for('blog.register') }}">Register in</a></li>
  37.  
     
  38.  
    </ul>
  39.  
     
  40.  
     
  41.  
    </div>
  42.  
    </div>
  43.  
    </div>
  44.  
    {% endblock %}
  45.  
     
  46.  
    {% block content %}
  47.  
    <div class="container">
  48.  
    {% for message in get_flashed_messages() %}
  49.  
    <div class="alert alert-warning">
  50.  
    <button type="button" class="close" data-dismiss="alert">&times;</button>
  51.  
    {{ message }}
  52.  
    </div>
  53.  
    {% endfor %}
  54.  
     
  55.  
    {% block page_content %}{% endblock %}
  56.  
    </div>
  57.  
    {% endblock %}
  58.  
     
  59.  
    {% block scripts %}
  60.  
    {{ super() }}
  61.  
    {{ moment.include_moment() }}
  62.  
    {% endblock %}

登录模板:

  1.  
    {% extends "form_base.html" %}
  2.  
    {% import "bootstrap/wtf.html" as wtf %}
  3.  
    {% block title %}Flasky{% endblock %}
  4.  
    {% block page_content %}
  5.  
     
  6.  
    <div class="page-header">
  7.  
    <h1>Login</h1>
  8.  
    </div>
  9.  
    <form action="/blog/login" method="post">
  10.  
    {{ wtf.quick_form(form) }}
  11.  
     
  12.  
    </form>
  13.  
     
  14.  
    {% endblock %}

注册模板:

  1.  
    {% extends "form_base.html" %}
  2.  
    {% import "bootstrap/wtf.html" as wtf %}
  3.  
    {% block title %}Flasky{% endblock %}
  4.  
    {% block page_content %}
  5.  
     
  6.  
    <div class="page-header">
  7.  
    <h1>Register</h1>
  8.  
    </div>
  9.  
    <form action="/blog/register" method="post">
  10.  
    {{ wtf.quick_form(form) }}
  11.  
     
  12.  
    </form>
  13.  
     
  14.  
    {% endblock %}

登录后模板:

  1.  
    <!DOCTYPE html>
  2.  
    {% extends 'form_base.html' %}
  3.  
    <html lang="en">
  4.  
    <head>
  5.  
    <meta charset="UTF-8">
  6.  
    <title>Title</title>
  7.  
    </head>
  8.  
    <body>
  9.  
     
  10.  
     
  11.  
    {% block page_content %}
  12.  
    <div class="page-header">
  13.  
    <h1>Hello,{{ name }}</h1>
  14.  
    </div>
  15.  
     
  16.  
    {% endblock %}
  17.  
    </body>
  18.  
    </html>

启动后访问:

http://127.0.0.1:6626/blog/

效果:

 
文章最后发布于: 2017-08-02 11:06:00
posted on 2019-11-20 17:28  曹明  阅读(1073)  评论(0)    收藏  举报