Flask----前后端不分离-登录

嚴華  论坛元老 | 2025-1-10 03:02:37 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1046|帖子 1046|积分 3138

扩展模块



  • flask-sqlalchmy,毗连数据库
  • flask-login,处置惩罚用户的登录,认证
  • flask-session,会话保持,默认对用户数据加密,存储在客户端浏览器的cookie中,每次请求时携带cookie来辨认用户;也可以存储在服务端的文件、数据库、缓存中;
  • flask-wtf 处置惩罚表单数据,防止csrf攻击;flask-wtf文档
 
flask-wtf 的简朴使用

基于flask-wtf 制作简朴的注册、登录页面;


  • 注册页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>注册页面</title>
  6.      <script src="/static/js/index.js"></script>
  7.     <link rel="stylesheet" href="/static/css/index.css">
  8. </head>
  9. <body>
  10. <form method="POST" action="/reg">
  11.     {{ form.csrf_token }}<br>
  12.     <h3>欢迎注册</h3><br>
  13.     {{ form.uname.label }} {{ form.uname(size=20) }}<br>
  14.     {{ form.passwd.label }}    {{ form.passwd(size=20) }}<br>
  15.     {{ form.confirm_passwd.label }} {{ form.confirm_passwd(size=20)}}<br>
  16.     <input type="submit" value="登录">
  17.     {% if form.errors %}
  18.     <ul class="errors">
  19.     {% for error in form.errors %}
  20.         <li>{{ error }}字段验证未通过</li>
  21.     {% endfor %}
  22.     </ul>
  23.     {% endif %}
  24. </form>
  25. </body>
  26. </html>
复制代码
这里的form变量是flask渲染模板时,传入的表单对象。,form.csrf_token分别在表单中、cookie中生成一个秘钥,在提交表单时,cookie中的秘钥连同表单中的秘钥一同传给后端举行验证,验证通过则为正当的请求。
登录页面实现类似;
 


  • flask后端定义表票据类、字段、验证器,app/_init_.py
  1. # __author__ = "laufing"
  2. import os
  3. from flask import Flask
  4. from .config import BaseConfig
  5. app = Flask(__name__)
  6. app.config.from_object(BaseConfig)
  7. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  8. # 模板地址
  9. app.template_folder = os.path.join(BASE_DIR, "templates")
  10. # 静态资源地址
  11. app.static_url_path = "/static/"
  12. app.static_folder = os.path.join(BASE_DIR, "static")
  13. # 导入表单
  14. from flask_wtf import FlaskForm
  15. # 导入字段
  16. from wtforms import StringField, PasswordField, IntegerField, DateTimeField, BooleanField
  17. from wtforms.validators import DataRequired, InputRequired # 必须输入
  18. from wtforms.validators import EqualTo
  19. class RegForm(FlaskForm):
  20.     uname = StringField("uname", validators=[InputRequired(), DataRequired()])
  21.     passwd = PasswordField("passwd", validators=[DataRequired(), InputRequired()])
  22.     confirm_passwd = PasswordField("confirm_passwd", validators=[EqualTo("passwd")])
  23. class LoginForm(FlaskForm):
  24.     # 在服务端验证用户的输入
  25.     uname = StringField("uname", validators=[DataRequired(), InputRequired()])
  26.     passwd = PasswordField("passwd", validators=[DataRequired(), InputRequired()])
复制代码


  • flask后端定义视图,main.py
  1. # __author__ = "laufing"
  2. from app import app
  3. from flask import render_template, jsonify, request, session, redirect, url_for
  4. from app import LoginForm, RegForm
  5. @app.route("/reg", methods=["GET", "POST"])
  6. def register():
  7.     if request.method == "GET":
  8.         form = RegForm()
  9.         return render_template("reg.html", form=form)  # 传入form对象渲染表单
  10.     form = RegForm()  # 接收request.form 表单数据
  11.     if form.validate_on_submit():
  12.         # 保存用户的信息,待实现
  13.         return redirect('/login')  # 重定向到 /login  GET
  14.     return render_template("reg.html", form=form)
  15. @app.route("/login", methods=["GET", "POST"])
  16. def login():
  17.     if request.method == "GET":  # 返回登录页面
  18.         return render_template("login.html", form=LoginForm())
  19.     # 实例化表单对象(自动接收request.form里的数据), 接收用户的登录数据
  20.     form = LoginForm()
  21.     # 按添加的验证器,进行验证数据 & 是否POST请求
  22.     if form.validate_on_submit():
  23.         print(form.uname.data)
  24.         print(form.passwd.data)
  25.         return jsonify({
  26.             "code": 200,
  27.             "msg": "登录成功"
  28.         })
  29.     # 验证未通过时,显示错误信息
  30.     return render_template("login.html", form=form)
  31. if __name__ == '__main__':
  32.     app.run(host="localhost", port=5050, debug=True)
复制代码


  • 目次布局

     
定义用户数据模子



  • 数据库mysql;
  • 驱动 flask-sqlalchmy
  • 迁移flask-migrate

    • flask db init 初始化,生成迁移目次(仅一次);
    • flask db migrate -m “描述”, 创建迁移脚本;
    • flask db upgrade,应用迁移,创建数据库、表;
    • flask db downgrade,降级
    • flask db history,迁移历史

  • 文件models/user_models.py
  • 版本

    • flask==2.0.3
    • jinja2=3.1.1
    • werkzeug == 2.0.3
    • sqlalchemy==1.3
    • flask-sqlalchemy==2.4.0
    • pyjwt==2.0.0
    • email-validator==1.0.5
    • packaging==21.0
    • flask-migrate==2.6.0

在窗口app对象的_init_.py文件中,添加如下:
  1. from flask-sqlalchemy import SQLAlchemy
  2. from flask-migrate import Migrate
  3. # ...
  4. db = SQLAlchemy()
  5. db.init_app(app)
  6. migrate = Migrate(app, db)
复制代码
创建models目次/ user_models.py:
  1. from app import db
  2. class UserModel(db.Model):
  3.     __tablename__ = "user_t"
  4.     uname = db.Column(db.String(50), unique=True)
  5.     passwd = db.Column(db.String(64), unique=True)
  6.     def __repr__(self):
  7.         return self.uname
复制代码
 
下令行下完成初始化、迁移:
  1. flask db init
  2. flask db migrate -m '生成迁移命令'
  3. flask db upgrade
复制代码
 
flask-login完成用户登录


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表