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
继承
本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/17406834.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步