flask的学习记录
结构如下:
app.py
from App import create_app
app = 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)
# 配置session
app.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_uri
app.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'] = username
return 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 response
else:
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.items
print(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 db
class 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>
原文地址:https://blog.csdn.net/weixin_42771529/article/details/142419037
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!