当前位置: 首页 > news >正文

flask的学习记录

结构如下:

app.py


from App import create_appapp = create_app()if __name__ == '__main__':app.run(debug=True,host='0.0.0.0',port=5000)

App/__init__.py

from flask import Flask, render_template, request, redirect, url_for
from .views import blue
from .exts import init_exts
def create_app():app = Flask(__name__)#注册蓝图app.register_blueprint(blueprint=blue)# 配置sessionapp.config['SECRET_KEY'] = '!@#¥%……'# 配置数据库# db_uri='sqlite:///sqlite3.db'# app.config['SQLALCHEMY_DATABASE_URI'] = db_uri# app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 配置数据库# db_uri ='@IP_ADDRESS:3306/272d5375a2f3'db_uri ='mysql+pymysql://root:123456@localhost:3306/flaskdb2'app.config['SQLALCHEMY_DATABASE_URI'] = db_uriapp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 配置数据库# 初始化插件init_exts(app)return app

App/views.py

#放路由"
from flask import Blueprint, render_template, request, redirect, url_for, make_response,session
from .models import *blue = Blueprint('user',__name__)
@blue.route('/')
@blue.route('/index')
def index():# username = request.cookies.get('username')username = session.get('username')return render_template("index.html",username=username)@blue.route('/string/<string:name>')
def string(name):return name@blue.route('/login',methods=['GET','POST'])
def login():if request.method == 'GET':return render_template("login.html")if request.method == 'POST':username = request.form.get('username')password = request.form.get('password')if User.query.filter(User.username==username,User.password==password).first():response= make_response(render_template('index.html',username=username))# response.set_cookie('username',username)session['username'] = usernamereturn response# if username == 'admin' and password == '123456':#     response= make_response(render_template('index.html',username=username))#     # response.set_cookie('username',username)#     session['username'] = username#     return responseelse:return render_template("login.html",msg='用户名或密码错误')@blue.route('/logout')
def logout():response = make_response(render_template('index.html',msg='退出成功'))# response.delete_cookie('username')session.pop('username')return response# 添加用户
@blue.route('/adduser',methods=['GET','POST'])
def adduser():if request.method == 'GET':return render_template("adduser.html")if request.method == 'POST':try:username = request.form.get('username')password = request.form.get('password')# is_admin = False  # 默认不是管理员# is_admin = request.form.get('is_admin')user = User(username=username,password=password)db.session.add(user)db.session.commit()return render_template('adduser.html',msg='添加成功')except Exception as e:print(e)return render_template('adduser.html',msg='用户名重复,或其他错误')@blue.route('/get_user')
def get_user():users = User.query.all()print(users)return "success"@blue.route('/paginate')
def paginate():page = request.args.get('page',1,type=int)per_page = request.args.get('per_page',10,type=int)pagination = User.query.paginate(page=page,per_page=per_page)# users = pagination.itemsprint(pagination.items)return render_template('paginate.html',pagination=pagination)@blue.route('/add_grade',methods=['GET','POST'])
def add_grade():# if request.method == 'GET':#     return render_template('add_grade.html')# if request.method == 'POST':#     name = request.form.get('name')#     user_id = request.form.get('user_id')#     grade = Grade(name=name,user_id=user_id)#     db.session.add(grade)#     db.session.commit()#     return render_template('add_grade.html',msg='添加成功')grades = []for i in range(1,10):grades.append(Grade(name='grade'+str(i)))grades.append(Grade(id=1))print(grades)try:db.session.add_all(grades)db.session.commit()return '添加年级成功'except Exception as e:print(e)db.session.rollback()# db.session.close()db.session.flush()return '添加年级失败'

App/models.py

# 数据
from .exts import dbclass User(db.Model):__tablename__ = 'user_info'id = db.Column(db.Integer, primary_key=True, autoincrement=True)username = db.Column(db.String(100), unique=True,nullable=False)password = db.Column(db.String(100), nullable=False)is_admin = db.Column(db.Boolean, default=False)# is_active = db.Column(db.Boolean, default=False)# model_type = db.Column(db.String(100), nullable=False)# model_type2 = db.Column(db.String(100), nullable=False)def __repr__(self):# Bug修复:返回字符串类型,使用f-string格式化字符串,使格式化字符串更加易读,减少出错return f"[{self.username}, {self.password},{self.is_admin}]"class Grade(db.Model):__tablename__ = 'grade_info'id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.String(100), unique=True, nullable=False)# 外键关联,关联到User表的id字段,反向引用user_id = db.Column(db.Integer, db.ForeignKey('user_info.id'))# 反向引用,关联到User表的grade字段students = db.relationship('Student', backref=db.backref('grade_info'), lazy='dynamic')def __repr__(self):return f"[{self.name}, {self.user_id}]"class Student(db.Model):__tablename__ = 'student_info'id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.String(100), unique=True, nullable=False)age = db.Column(db.Integer, nullable=False)# 外键关联,关联到Grade表的id字段grade_id = db.Column(db.Integer, db.ForeignKey('grade_info.id'))

App/exts.py

# 放插件的地方from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
db = SQLAlchemy()
migrate = Migrate()def init_exts(app):db.init_app(app)migrate.init_app(app, db)

以下为html代码:位于App/templates/

.index.html

<!DOCTYPE html><html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h2>首页</h2><hr>{% if username %}<h3>欢迎{{ username }}</h3><a href="/logout">注销</a>{% else %}<a href="/login">登录</a>{% if msg %}<h3>{{ msg }}</h3>{% endif %}{% endif %}<hr><a href="/adduser">添加</a></body>
</html>

login.html

<!DOCTYPE html><html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h2>登录</h2><form action="/login" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" value="登录"></form><h3>{{ msg }}</h3></body>
</html>

addusr.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>{% if msg %}<h3>{{ msg }}</h3>
{% else %}<!--注册用户--><form action="/adduser" method="post" onsubmit="return validatePassword()">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br>确认密码:<input type="password" name="repassword"><br><input type="submit" value="注册"></form><script>function validatePassword() {var username = document.getElementsByName("username")[0].value;var password = document.getElementsByName("password")[0].value;var repassword = document.getElementsByName("repassword")[0].value;if (username == '') {alert("用户名不能为空!");return false;}if (password!= repassword) {alert("两次密码不一致!");return false;}return true;}</script>{% endif %}
</body>
</html>

base.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>欢迎</title><link rel="stylesheet" href="{{url_for('static',filename='css/base.css')}}">{% block head %}{% endblock %}
</head>
<body><h1>欢迎使用学校教师教学成绩计算系统</h1><h5>使用帮助:</h5><script src="{{url_for('static',filename='js/base.js')}}"></script>{% block body %}{% endblock %}</body>
</html>

paginate.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h2>分页</h2><hr>{% for item in pagination.items %}<p>{{ item }}</p>{% endfor %}
</body>
</html>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Transformer模型-7- Decoder
  • 如何有效检测住宅IP真伪?
  • Lubuntu电源管理
  • 深度学习经典模型之BERT(上)
  • 深入解析仓颉语言中的变量操作与赋值技巧
  • 十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能
  • 【C++】C++入门概念(一)
  • 大数据-143 - ClickHouse 集群 SQL 超详细实践记录!
  • kafka3.8的基本操作
  • 华为HarmonyOS地图服务 5 - 利用UI控件和手势进行地图交互
  • SAP学习笔记 - 开发06 - CDSView + Fiori Element 之 List Report
  • 基于PHP的CRM管理系统源码/客户关系管理CRM系统源码/php源码/附安装教程
  • SQL中的WITH AS语法
  • 线程知识点补充
  • 【Kubernetes】常见面试题汇总(二十九)
  • [nginx文档翻译系列] 控制nginx
  • canvas 绘制双线技巧
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java 内存分配及垃圾回收机制初探
  • JS笔记四:作用域、变量(函数)提升
  • js面向对象
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • redis学习笔记(三):列表、集合、有序集合
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 构建工具 - 收藏集 - 掘金
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 前端临床手札——文件上传
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 微服务框架lagom
  • 小程序测试方案初探
  • 携程小程序初体验
  • 一起参Ember.js讨论、问答社区。
  • 原生js练习题---第五课
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • # .NET Framework中使用命名管道进行进程间通信
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • #100天计划# 2013年9月29日
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (层次遍历)104. 二叉树的最大深度
  • (二)Linux——Linux常用指令
  • (分享)自己整理的一些简单awk实用语句
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三)Honghu Cloud云架构一定时调度平台
  • (三十五)大数据实战——Superset可视化平台搭建
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • .net FrameWork简介,数组,枚举
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .NET简谈设计模式之(单件模式)
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • /*在DataTable中更新、删除数据*/