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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1541807.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

VisualPromptGFSS

COCO-20 i ^i i太大&#xff0c;不建议复现

golang学习笔记1-go程序执行流程

声明&#xff1a;本人已有C&#xff0c;C,Python基础&#xff0c;只写本人认为的重点&#xff0c;方便自己回顾。 命令行执行go程序有两种方式&#xff0c;其流程如下图 注意第一种方式会得到可执行文件&#xff0c;第二种不会。 例1 在当前目录下编译hello.go go build hel…

TypeScript入门 (三)数据类型

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。本文旨在全面介绍 TypeScript 中的各种数据类型&#xff0c;帮助读者深入理解每种数据类型的用法、内置属性…

Matlab simulink建模与仿真 第十九章(生成C代码)

一、Configuration Parameters模型参数配置 1、仿真时间 &#xff08;1&#xff09;在Solver选项卡中可以设置仿真的起始时间和结束时间&#xff0c;一般起始时间设为0&#xff0c;而结束时间按需设置。 &#xff08;2&#xff09;如果希望仿真不会自动暂停&#xff08;也就…

Qwen大型语言模型系列的最新成果 ----Qwen2.5

通义千问2.5-7B-Instruct-GGUF 模型库 (modelscope.cn) apt install git-lfsgit lfs installgit clone https://www.modelscope.cn/qwen/Qwen2.5-7B-Instruct-GGUF.git

(done) 声音信号处理基础知识(3) (一个TODO: modulation 和 timbre 的关联)(强度、响度、音色)

来源&#xff1a;https://www.youtube.com/watch?vJkoysm1fHUw sound power 通常可以被认为是能量传输的速率 声源往所有方向传输的每时间单位能量 用 瓦特(W) 作为单位测量 Sound intensity 声音强度&#xff0c;每单位面积的 sound power W/m^2 人类实际上能听到非常小强…

Mybatis+Druid+MybatisPlus多数据源配置

MybatisDruidMybatisPlus多数据源配置 平常我们使用的是 properties 或者 yaml 来配置数据库的地址、用户名、密码等 但是这样只能配置一个数据源 现在我们想在一个项目里面配置多个数据源&#xff0c;那么我们就需要配置自己的配置类 配置类和配置文件 Mybatismysqldruid配置…

此框架你到底了解多少???

1.简述对Spring中IOC/DI的理解 IOC&#xff1a;控制反转&#xff0c;将创建和管理的对象的任务交给外部的Spring容器 DI&#xff1a;依赖注入&#xff0c;对象之间存在依赖关系&#xff0c;创建对象时&#xff0c;对其依赖的对应直接进行赋值 2.有哪些依赖注入的方式 基于注…

在线教程丨1 步生成 SOTA 级别图像,Hyper-SD 一键启动教程上线!

近年来&#xff0c;扩散模型在文生图任务中得到了广泛的应用&#xff0c;但其在实现高质量图像生成的过程中&#xff0c;通常需要多步推理进行去噪&#xff0c;这显然大大增加了计算资源成本。 针对于此&#xff0c;研究人员引入蒸馏算法&#xff0c;推出了扩撒感知蒸馏算法来…

超实用的 Typora 插件

&#x1f33c;&#x1f4da;Typora 是一款高效、易用且跨平台的 Markdown 编辑器和阅读器&#xff0c;其具有小巧、快速、实时预览等特点&#xff0c;非常受大家的欢迎。今天给大家推荐一款如虎添翼的 Typora 插件(Typora Plugin)&#xff0c;它可以通过插件增强 Typora 的功能…

什么是调制?FM 和 AM 有什么区别?

来源&#xff1a;https://www.bilibili.com/video/BV1pp411d7Zg/?spm_id_fromautoNext&vd_source7a1a0bc74158c6993c7355c5490fc600 一张图说明一切 原因&#xff1a;低频信号传输距离很近&#xff0c;高频信号传输距离较远。 为了把低频信号传出去&#xff0c;需要把低…

【数据结构C语言】【入门】【首次万字详细解析】入门阶段数据结构可能用到的C语言知识,一章让你看懂数据结构!!!!!!!

前言&#xff1a;欢迎各位光临本博客&#xff0c;这里小编带你直接手撕入门阶段的数据结构的C语言知识&#xff0c;让你不再看见数据结构就走不动道。文章并不复杂&#xff0c;愿诸君耐其心性&#xff0c;忘却杂尘&#xff0c;道有所长&#xff01;&#xff01;&#xff01;&am…

图片马赛克处理(Java)

1.需求 给图片的指定区域打码给整张图片打码马赛克方格取色支持中心点取色和随机取色马赛克支持灰度处理 2.源码 package com.visy.utils;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOE…

我们如何通过两个关键测试原则,进行自动化 Kubernetes 配置和Secret测试

现如今&#xff0c;一个上规模的应用程序几乎都会使用 Kubernetes 作为管理环境实现自动扩展、负载平衡&#xff08;auto scaling, load balancing &#xff09;等机制。与之相应的&#xff0c;我们通常会使用一个 repository 专门管理一个组织内部各项不同应用程序在各个环境的…

领夹麦克风怎么样,无线领夹麦克风哪个牌子好,家用麦克风推荐

​作为消费类电子产品&#xff0c;麦克风随着市场需求和技术进步&#xff0c;每年都有新产品系列涌现&#xff0c;特别是领夹麦克风&#xff0c;近年来经历了显著的市场变革和技术突破。从早期的新闻采访、节目录制和影视后期录音中常用的无线小蜜蜂话筒&#xff0c;到如今在网…

如何选择公司

前言&#xff1a; 了不起学弟&#xff1a;学长啊&#xff0c;我这手上有几个offer&#xff0c;有几家不同种类的公司&#xff0c;我这该怎么选啊。。。 了不起&#xff1a;这确实是在正在找工作的同学一定会遇到的问题&#xff0c;如何选择公司。那我就给你讲一讲吧。 正文&…

6张图掌握提示词工程师工作范围与工作技巧(提示词原理篇)

在人工智能的疆域中&#xff0c;提示词工程师扮演着至关重要的角色。他们精心设计的话语&#xff0c;是引导AI模型理解人类需求、激发创造力的关键。如同指挥官的号令&#xff0c;提示词工程师的每一个提问&#xff0c;都让AI的潜力得到释放&#xff0c;让技术与智慧的对话更加…

u-code-input结合u-keyboard实现支付密码+数字键盘

u-code-input结合u-keyboard实现支付密码数字键盘 一、需求描述、框架&#xff08;一&#xff09;技术框架&#xff08;二&#xff09;需求 二、效果图三、代码实现&#xff08;一&#xff09;u-code-input组件小改造&#xff08;二&#xff09;功能实现 一、需求描述、框架 &…

java 异常-Exception

异常的概念 Java 语言中&#xff0c;将程序执行中发生的不正常情况称为“异常”。&#xff08;开发过程中的语法错误和逻辑错误不是异常&#xff09; 执行过程中所发生的异常事件可分为两大类 &#xff08;1&#xff09;Error&#xff08;错误&#xff09;&#xff1a;Java 虚…

[Python]案例驱动最佳入门:股票分析 Python数据分析与可视化实战

在股票市场中&#xff0c;价格波动和投资决策紧密相连。通过数据分析&#xff0c;投资者可以识别市场趋势、价格波动背后的规律&#xff0c;并做出明智的投资决策。Python凭借其强大的数据处理和可视化功能&#xff0c;在金融市场分析中被广泛应用。本文将通过一个假设的股票市…