flask

other:https://github.com/kitzza/Python/tree/main/flaskProject1

库:

alembic==1.11.0
click==8.1.3
colorama==0.4.6
Flask==2.2.5              # 1
Flask-Migrate==4.0.4
Flask-SQLAlchemy==3.0.3   # 1
greenlet==2.0.2
importlib-metadata==6.6.0
importlib-resources==5.12.0
itsdangerous==2.1.2
Jinja2==3.1.2
Mako==1.2.4
MarkupSafe==2.1.2
PyMySQL==1.0.3             # 1
SQLAlchemy==2.0.13
typing_extensions==4.5.0
Werkzeug==2.2.3
zipp==3.15.0

结构:

代码如下:

from flask import Flask, render_template, request, redirect, url_for
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text
from flask_migrate import Migrate

app = Flask(__name__)

# mysql主机
HOSTNAME = "127.0.0.1"
PORT = 3306
USERNAME = "root"
PASSWORD = "123456"
DATABASE = "db516"

app.config[
    'SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"

# 在app.config中设置好连接数据库的信息
# 然后使用SQLAlchemy(app)常见一个db对象
# SQLAlchemy会自动读取app.config中连接数据库的信息
db = SQLAlchemy(app)
migrate = Migrate(app, db)

# ORM模型映射成表的三步
# 1、flask db init :这个步骤只需执行一次
# 2、flask db migrate : 识别ORM模型的改变,生成迁移脚本
# 3、flask db upgrade: 运行迁移脚本,同步到数据库中

# # 测试连接是否成功
# with app.app_context():
#     with db.engine.connect() as conn:
#         query_str = text("select 1")
#         rs = conn.execute(query_str)
#         print(rs.fetchone())

# 创建表
class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    # varchar, null=0
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(100))
    signature = db.Column(db.String(100))


# 文章表
class Article(db.Model):
    __tablename__ = "article"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)

    # 添加作者的外键
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    # backref:会自动的给User模型添加一个article的属性,用来获取文章列表
    author = db.relationship("User", backref="articles")

# article = Article(title="flask学习大纲", content="FlaskXXXXXXXX")
# article.author_id = user.id
# user = User.query.get(article.author_id)
# article.author = User.query.get(article.author_id)
# print(article.author)


# # 应用上下文
# with app.app_context():
#     db.create_all()  # 这个有局限性,新增属性不会更新


# user = User(username="张三", password='111111')
# sql: insert user (username, password) values ("张三","111111")


# user创建用户
@app.route("/user/add")
def add_user():
    # 1、创建ORM对象
    user = User(username="张三", password='111111')

    # 2、将ORM对象添加到db.session中
    db.session.add(user)

    # 3、将db.session中的改变同步到数据库中
    db.session.commit()
    return "创建成功!"


# user数据库查询
@app.route('/user/query')
def query_user():
    # 1、 get查找:根据主键查找
    # user = User.query.get(1)
    # print(f'{user.id}--{user.username}--{user.password}')
    # 2、filter_by查找
    # Query:类数组
    users = User.query.filter_by(username="张三")
    print(type(users))   # <class 'flask_sqlalchemy.query.Query'>
    for user in users:
        print(user)
    return "数据查找成功"

# user修改
@app.route('/user/update')
def update_user():
    user = User.query.filter_by(username="张三").first()
    user.password = "222222"
    db.session.commit()
    return "数据修改成功!"


# user删除
@app.route('/user/delete')
def delete_user():
    # 1、查找
    # get查找:根据主键查找
    user = User.query.get(3)
    # 2、从db.session中删除
    db.session.delete(user)
    # 3、将db.session中的修改,同步到数据库中
    db.session.commit()
    return "数据删除成功"


# 文章添加
@app.route('/article/add')
def article_add():
    article1 = Article(title="flask学习大纲", content="FlaskXXXXXXXX")
    article1.author = User.query.get(2)

    article2 = Article(title="Django学习大纲", content="DjangoXXXXXXXX")
    article2.author = User.query.get(2)

    # 添加到session中
    db.session.add_all([article1, article2])
    # 同步session中的数据到数据库中
    db.session.commit()

    return "文章添加成功!"

# 文章查找
@app.route('/article/query')
def query_article():
    user = User.query.get(2)
    for article in user.articles:
        print(article.title)
    return "文章查找成功"




# 自定义过滤器
def datetime_format(value, format="%Y-%d-%m %H:%M"):
    return value.strftime(format)


app.add_template_filter(datetime_format, "dformat")


class User2:
    def __init__(self, username, email):
        self.username = username
        self.emil = email


# 测试
@app.route('/')
def hello_world():  # put application's code here
    user = User2("你的帅哥", email="552551@qq.com")

    info_dict = {
        'name': "账务",
        'age': 18
    }

    return render_template('index.html', user=user, info_dict=info_dict)


# 登录
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':

        print("登录成功")
        return redirect(url_for('login_success'))
    else:
        return render_template('login.html')


# 登录成功
@app.route('/login_success')
def login_success():
    return render_template('login_secc.html')


# 主页
@app.route('/index')
def index():
    name = "张三"
    return render_template("index.html", name=name)


# 带参数的url 将参数固定到了path中
@app.route('/blog/<int:blog_id>')
def blog_detail(blog_id):  # 博客详情
    # return f"访问的博客id是{blog_id}"
    return render_template('blog_detail.html', blog_id=blog_id)


# 查询字符串的方式传参
# /book/list 返回第一页的数据
# /book/list?page=2  获取第二页的数据
@app.route('/book/list')
def book_list():
    # request.args 类字典类型
    page = request.args.get("page", default=1, type=int)
    return f'获取的是{page}页数'


# Jinja2内置过滤器使用
@app.route('/filter')
def filter_demo():
    user = User("你的帅哥", email="56565@qq.com")

    # 自定义过滤器
    mytime = datetime.now()
    return render_template('filter.html', user=user, mytime=mytime)


# 控制语句
@app.route('/control')
def control_statement():
    age = 17
    books = [{
        "name": "三国演义",
        "author": "罗贯中"
    }, {
        "name": "水浒传",
        "author": "施耐庵"
    }, ]

    return render_template("control.html", age=age, books=books)


# 模板继承
@app.route('/child1')
def child1():
    return render_template('child1.html')


# 模板继承
@app.route('/child2')
def child2():
    return render_template('child2.html')


@app.route('/static')
def static_demo():
    return render_template('static.html')


if __name__ == '__main__':
    app.run(debug=True)

Jinja2模板

base

继承

posted @ 2023-05-16 21:11  __username  阅读(44)  评论(0)    收藏  举报