自学内容网 自学内容网

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)!