Python 基于Flask的Web开发【1】【用户登录 注册】
发表于:2024-11-24 作者:热门IT资讯网编辑
编辑最后更新 2024年11月24日,实现目标基于Flask实现用户的登录/注册。设计思路前端1.编写登录和注册表单2.编写视图函数3.编写相应的html文件4.页面测试后台1.创建数据库2.修改配置文件3.编写数据表类并生成数据表4.修
实现目标
基于Flask实现用户的登录/注册。
设计思路
- 前端
1.编写登录和注册表单
2.编写视图函数
3.编写相应的html文件
4.页面测试 - 后台
1.创建数据库
2.修改配置文件
3.编写数据表类并生成数据表
4.修改视图函数,实现数据交互
前端实现
1.编写登录和注册表单(/app/home/forms.py)
# 导入表单基类from flask_wtf import FlaskForm# 导入需要用到的表格类型from wtforms import StringField, PasswordField, SubmitField# 导入需要用的验证方式from wtforms.validators import DataRequired, EqualTo, Length, Email# 用户注册表单class RegisterForm(FlaskForm): # 用户名表框 username = StringField( label= '用户名', # 标签 validators=[ # 验证方式 DataRequired() # 不能为空 ] ) # 密码表框 password = PasswordField( label='密码', validators=[ DataRequired(), Length(6,16,message='密码长度应在6-16位') # 密码长度必须在6-16,否则输出提示信息 ] ) # 邮箱表框 email = StringField( label='邮箱', validators=[ DataRequired(), Email(message='邮箱不合法') ] ) # 注册按钮 submit = SubmitField( label='注册' )# 登录表单class LoginForm(FlaskForm): username = StringField( label='用户名', validators=[ DataRequired() ] ) password = PasswordField( label='密码', validators=[ Length(6, 16, message='密码长度应在6-16位') ] ) submit = SubmitField( label='登录' )
2.编写视图函数(/app/home/views.py)
from . import home_bp # 导入蓝图from flask import render_template # 用于模板渲染@home_bp.route('/')def index(): return render_template('index.html')@home_bp.route('/login/',methods =['GET','POST'])def login(): from app.home.forms import LoginForm form = LoginForm() return render_template('login.html',form=form)@home_bp.route('/register/',methods =['GET','POST'])def register(): from app.home.forms import RegisterForm form = RegisterForm() return render_template('register.html',form=form)
3.编写相应的html文件
基模板(/app/templates/base.html)
为了统一页面风格,继承bootstrap/base.html,创建自己的基模板登录页面(/app/templates/login.html)
登录页面,继承自上面的base.html,并在content中生成登录表单- 注册页面(/app/templates/register.html)
注册页面,继承自上面的base.html,并在content中生成注册表单
4.测试效果
后台实现
1.创建数据库
在mysql shell中创建数据库
2.修改配置文件
在配置文件中添加代码如下:
# 数据库配置SQLALCHEMY_DATABASE_URI ="mysql://root:mysql@locallost/sentry" # 指定数据库SQLALCHEMY_TRACK_MODIFICATIONS = False # 关闭追踪
3.编写数据表类并生成数据表
在models.py中编写数据表结构如下:
from app import db# 用户数据表class User(db.Model): id = db.Column(db.Integer,primary_key=True,autoincrement=True) name = db.Column(db.String(30),unique=True) password = db.Column(db.String(300)) email = db.Column(db.String(40),unique=True) def __repr__(self): return ""%self.name
在__init__.py中利用SQLAlchemy实例化数据库对象
from flask_sqlalchemy import SQLAlchemyimport pymysql# 数据库报错问题pymysql.install_as_MySQLdb()# 读取配置文件的配置信息app.config.from_pyfile('../config.py')db = SQLAlchemy(app)
在manage.py中添加代码如下:
from app import db # 导入数据库对象from werkzeug.security import generate_password_hash # 哈希加密from app.models import User # 导入数据表类@manager.command # 使函数可以作为命令在shell中直接执行def db_init(): db.drop_all() # 删除已有数据表 db.create_all() # 创建新数据表 admin = User(name='admin', password=generate_password_hash('admin')) # 实例化一个用户对象 db.session.add(admin) # 添加入session db.session.commit() # 提交给数据库 print("数据库初始化成功")
在python shell 中执行 python manage.py db_init 即可完成数据库初始化 在mysql中查看
4.修改视图函数,实现数据交互
from werkzeug.security import generate_password_hash # 哈希加密from app import dbfrom . import home_bp # 导入蓝图from flask import render_template, redirect, request, flash, session, url_for@home_bp.route('/')def index(): return render_template('index.html')# 登录@home_bp.route('/login/',methods =['GET','POST'])def login(): from app.home.forms import LoginForm from app.models import User form = LoginForm() if form.validate_on_submit(): # 获取表单中的数据 username = form.username.data password = form.password.data # 在数据库中查找 user = User.query.filter_by(name = username).first() # 用户名和密码匹配成功时 if user and user.verify_password(password): # 登陆成功将用户信息添加到session信息中去 session['user']=user.name session['id']= user.id flash('登录成功') return redirect(url_for('home.index')) flash('用户名或密码错误') return render_template('login.html',form=form)# 注册@home_bp.route('/register/',methods =['GET','POST'])def register(): from app.home.forms import RegisterForm from app.models import User form = RegisterForm() if form.validate_on_submit(): # 获取表单中的数据 name = form.username.data password = form.password.data email = form.email.data if User.query.filter_by(name=name).first(): flash('用户名已存在') return redirect(url_for('home.register')) if User.query.filter_by(email=email).first(): flash('邮箱已占用') return redirect(url_for('home.register')) # 密码进行哈希加密 user = User(name=name,password=generate_password_hash(password),email=email) db.session.add(user) db.session.commit() flash('注册成功,请登录') return redirect(url_for('home.login')) return render_template('register.html',form=form)# 注销@home_bp.route('/logout/')def logout(): # 清除session信息 session.clear() return redirect(url_for('home.login'))