37创客科创中心

 找回密码
 立即注册
查看: 1227|回复: 2

0526初中组 增删改查和授权

  [复制链接]

194

主题

324

帖子

2399

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2399
发表于 2024-5-19 11:38:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
  1. from flask import Flask, render_template, redirect, url_for, request, flash
  2. from flask_login import (
  3.     LoginManager,
  4.     UserMixin,
  5.     login_user,
  6.     login_required,
  7.     logout_user,
  8.     current_user,
  9. )

  10. from flask_sqlalchemy import SQLAlchemy

  11. from flask_bootstrap import Bootstrap5, SwitchField
  12. from flask_wtf import FlaskForm, CSRFProtect
  13. from wtforms.fields import *

  14. app = Flask(__name__)
  15. app.config["SECRET_KEY"] = "20200808"
  16. app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///login505.db"

  17. # 设置按钮默认样式和尺寸参数
  18. app.config['BOOTSTRAP_BTN_STYLE'] = 'primary'
  19. app.config['BOOTSTRAP_BTN_SIZE'] = 'sm'
  20. # 设置表格操作按钮
  21. app.config['BOOTSTRAP_TABLE_VIEW_TITLE'] = 'Read读取'
  22. app.config['BOOTSTRAP_TABLE_EDIT_TITLE'] = 'Update修改'
  23. app.config['BOOTSTRAP_TABLE_DELETE_TITLE'] = 'Remove删除'
  24. app.config['BOOTSTRAP_TABLE_NEW_TITLE'] = 'Create新建'

  25. db = SQLAlchemy(app)

  26. login_manager = LoginManager()
  27. login_manager.init_app(app)
  28. login_manager.login_view = "login"
  29. login_manager.login_message = "请先登录"

  30. # 实例化UI bootstrap5
  31. bootstrap = Bootstrap5(app)
  32. # 跨域访问实例化
  33. csrf = CSRFProtect(app)


  34. ### 创建 User 模型
  35. class User(UserMixin, db.Model):
  36.     id = db.Column(db.Integer, primary_key=True)
  37.     username = db.Column(db.String(80), unique=True, nullable=False)
  38.     password = db.Column(db.String(120), nullable=False)


  39. class ULoginForm(FlaskForm):
  40.     username = StringField("用户名")
  41.     password = PasswordField("密码")
  42.     submit = SubmitField("登入")
  43.     Logout = SubmitField("退出")
  44.     Cancel = SubmitField("取消")


  45. class ELoginForm(FlaskForm):
  46.     id = IntegerField('编号')
  47.     username = StringField("用户名")
  48.     password = PasswordField("密码")
  49.     submit = SubmitField("登入")
  50.     Logout = SubmitField("退出")
  51.     Cancel = SubmitField("取消")


  52. # 新增数据----------------------------------------------------------------------
  53. @app.route('/new', methods=['GET', 'POST'])
  54. def new():
  55.     form = ELoginForm()
  56.     aiuser = User()
  57.     if form.validate_on_submit():
  58.         op = form.username.data
  59.         log = form.password.data
  60.         id = form.id.data
  61.         user = User(id=id, password=log, userrname=op)
  62.         db.session.add(user)
  63.         db.session.commit()
  64.         flash("你的信息已经保存!")
  65.         return redirect(url_for("index"))
  66.     return render_template('ai_new.html', form=form, title='新增')


  67. # 删除数据----------------------------------------------------------------------
  68. @app.route('/delete/<id>', methods=['GET', 'POST'])
  69. def delete(id):
  70.     aiuser = User.query.get(id)
  71.     flash(f'编号:  {id} --{aiuser.username}-----{aiuser.password}-----的用户数据删除完成.')
  72.     if aiuser:
  73.         db.session.delete(aiuser)
  74.         db.session.commit()
  75.         return redirect(url_for("index"))
  76.     return f'提示: {id} 数据不存在无法删除. 返回 <a href="/ai">表格</a>.'


  77. # 查看数据----------------------------------------------------------------------
  78. @app.route('/view/<id>', methods=['GET', 'POST'])
  79. def view(id):
  80.     aiuser = User.query.get(id)
  81.     form = ULoginForm()
  82.     # form.id.data = aiuser.id
  83.     form.username.data = aiuser.username
  84.     form.password.data = aiuser.password
  85.     if form.validate_on_submit():
  86.         return redirect(url_for("index"))
  87.     if aiuser:
  88.         return render_template('ai_View.html', form=form, message=aiuser)
  89.     return f'没有对应数据 {id} 存在. 返回 <a href="/ai">table</a>.'


  90. # 编辑数据----------------------------------------------------------------------
  91. @app.route('/edit/<id>', methods=['GET', 'POST'])
  92. def edit(id):
  93.     # 第一步:定义表单和获取数据
  94.     form = ELoginForm()
  95.     aiuser = User.query.get(id)
  96.     # 第三步:点击保存数据
  97.     if form.validate_on_submit():
  98.         # 获取页面数据到数据对象模型
  99.         aiuser.username = form.username.data
  100.         aiuser.password = form.password.data
  101.         db.session.commit()  # 提交保存数据
  102.         flash("用户信息已经更新!")  # 提示数据操作状态
  103.         return redirect(url_for("index"))  # 定向到列表函数页面
  104.     # 第二步:读取数据显示处理
  105.     # 把数据发送到页面表单中
  106.     form.username.data = aiuser.username
  107.     form.password.data = aiuser.password
  108.     form.id.data = aiuser.id
  109.     # 提示操作情况
  110.     flash("用户信息读取完成!")
  111.     # 数据显示页面渲染
  112.     return render_template('ai_edit.html', form=form, title='编辑')


  113. # 测试显示所有数据信息===================================================================
  114. # ctrl+/ 注释代码
  115. @app.route("/i")
  116. @login_required
  117. def index():
  118.     titles = [
  119.         ("id", "编号"),
  120.         ("username", "用户名"),
  121.         ("password", "密码"),
  122.     ]  # 自定义标题
  123.     page = request.args.get("page", 1, type=int)
  124.     pagination = User.query.paginate(page=page, per_page=5)
  125.     user = pagination.items
  126.     print(user)
  127.     return render_template(
  128.         "AItable.html",
  129.         pagination=pagination,
  130.         titles=titles,
  131.         messages=user,
  132.         Message=User,
  133.         title="37创客授权用户",
  134.     )


  135. ### 受保护的视图
  136. @app.route("/user")
  137. @login_required  # 增加验证部分代码
  138. def user():
  139.     return f"欢迎: {current_user.username}"


  140. # ==========================================用户授权部分===================================================================
  141. ### 用户加载函数
  142. @login_manager.user_loader
  143. def load_user(user_id):
  144.     return User.query.get(int(user_id))


  145. ### 登录视图
  146. @app.route("/", methods=["GET", "POST"])
  147. @app.route("/login", methods=["GET", "POST"])
  148. def login():
  149.     form = ULoginForm()
  150.     if request.method == "POST":
  151.         username = request.form["username"]
  152.         password = request.form["password"]
  153.         user = User.query.filter_by(username=username, password=password).first()
  154.         if user:
  155.             login_user(user)
  156.             flash("登录成功!")
  157.             return redirect(url_for("index"))
  158.         else:
  159.             flash("用户不存在请核对")
  160.     flash("请输入你的用户名和密码!")
  161.     return render_template("ulogin.html", form=form, title="37创客登录")


  162. ### 退出操作
  163. @app.route("/logout")
  164. @login_required
  165. def logout():
  166.     logout_user()
  167.     return redirect(url_for("login"))


  168. if __name__ == "__main__":
  169.     app.run(host="0.0.0.0", port=84, debug=True)
复制代码



回复

使用道具 举报

194

主题

324

帖子

2399

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2399
 楼主| 发表于 2024-5-19 11:39:14 | 显示全部楼层
base.html

  1. <!--引用bootstrap资源-->
  2. {% from 'bootstrap5/nav.html' import render_nav_item %}
  3. {% from 'bootstrap5/utils.html' import render_messages %}
  4. <!DOCTYPE html>
  5. <html lang="en">
  6. <head>
  7.     <meta charset="utf-8">
  8.     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  9.     <title>{{ title }}</title>
  10.     <link rel="icon" href="{{ url_for('static', filename='favicon.ico') }}">
  11. <!--    引用样式文件-->
  12.     {{ bootstrap.load_css() }}
  13.     <style>
  14.         pre {
  15.             background: #ddd;
  16.             padding: 10px;
  17.         }
  18.         h2 {
  19.             margin-top: 20px;
  20.         }
  21.         footer {
  22.             margin: 20px;
  23.         }

  24.     </style>
  25. </head>
  26. <body>


  27. <main class="container">
  28.     {{ render_messages(container=False, dismissible=True) }}
  29.     {% block content %}{% endblock %}
  30. </main>
  31. <!--底部-->
  32. <footer class="text-center">
  33.     {% block footer %}
  34.     <small> © 2018– 2025
  35.         <script>document.write(new Datetime().getFullYear())</script>
  36.         <a href="https://www.37ck.cn">37创客</a>
  37.     </small>
  38.     {% endblock %}
  39. </footer>
  40. <!--引入js效果脚本-->
  41. {{ bootstrap.load_js() }}
  42. </body>
  43. </html>
复制代码


AItable.html
  1. {% extends 'base.html' %}
  2. {% from 'bootstrap5/table.html' import render_table %}
  3. {% from 'bootstrap5/pagination.html' import render_pager, render_pagination %}

  4. {% block content %}

  5.     <h2>{{ title }}</h2>

  6.     {{ render_table(messages,titles, show_actions=True, model=Message,
  7. view_url=('view', [('id', ':id')]),edit_url=('edit', [('id', ':id')]),delete_url=('delete', [('id', ':id')]),new_url=url_for('new')) }}
  8.     {{ render_pagination(pagination) }}
  9. {% endblock %}
复制代码



回复

使用道具 举报

194

主题

324

帖子

2399

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2399
 楼主| 发表于 2024-5-19 11:41:59 | 显示全部楼层
alist.html
  1. {% extends 'base.html' %}
  2. {% from 'bootstrap5/table.html' import render_table %}
  3. {% from 'bootstrap5/pagination.html' import render_pager, render_pagination %}

  4. {% block content %}

  5.     <h2>{{ title }}</h2>

  6.     {{ render_table(messages,titles, show_actions=True, model=Message,
  7. view_url=('view', [('id', ':id')]),edit_url=('edit', [('id', ':id')]),delete_url=('delete', [('id', ':id')]),new_url=url_for('new')) }}
  8.     {{ render_pagination(pagination) }}
  9. {% endblock %}
复制代码
view.html
  1. {% extends 'base.html' %}
  2. {% from 'bootstrap5/form.html' import render_form, render_field, render_form_row %}

  3. {% block content %}

  4. <h2>{{title}}</h2>
  5. <form method="post">
  6. {{ render_form(form,button_style='success') }}

  7. </form>
  8. {% endblock %}
复制代码









回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|37创客科创中心

GMT+8, 2025-12-10 05:12 , Processed in 0.149380 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表