# python-flask-jinja **Repository Path**: leslie43/python-flask-jinja ## Basic Information - **Project Name**: python-flask-jinja - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-14 - **Last Updated**: 2025-07-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: Python, Flask, MySQL, jinja, ORM ## README ### # 开启debug模式.可以自动刷新 - environment variables: FLASK_DEBUG=1 ### Additional Options - 在 additional option 添加 --host=0.0.0.0 - 在 additional option 添加 --port=1944 - additional option的选项使用 空格隔开 ### placehoder ``` 'Blog {}, {}'.format(blog_id,"2nd param placeholder") => Blog 1943 2nd param placeholder ``` ### Jinja:自定义管道符 - 1: 定义方法 ```python def datetime_format(value, expect_format="%Y-%m-%d %H:%M"): return value.strftime(expect_format) ``` 2: 添加過濾器並設置過濾器名稱 ```python app.add_template_filter(datetime_format, 'dformat') ``` 3: 使用過濾器 ```python @app.route("/filter") def filter_demo(): mytime = datetime.now() user = User("Leslie","leslie@1943.com",123456) return render_template("filter.html",user=user, time=mytime) ``` 4: 模板中使用: ```html
{{ time | dformat }}
``` ### 模版继承 - 使用 `{% extends "base.html" %}` 继承其他的模版 - 使用 block xxxx 来占位 `{% block title %} {% endblock %}` 给被继承的模版传递值 ```html {% block title %} {% endblock %} {% block body %} {% endblock %}
footer
{% extends "base.html" %} {% block title %} I am child title {% endblock %} {% block body %} I am child body {% endblock %} ``` ### 引入静态文件 ```html ``` ### 操作数据库 - pip install pymysql - pip install flask-sqlalchemy -ORM ### ORM ```python class User(db.Model): __tablename__ = 'user' # table name id = db.Column(db.Integer, primary_key=True,autoincrement=True) # primary key # varchar 100 username = db.Column(db.String(100), unique=True, nullable=False) # Column username password = db.Column(db.String(100), nullable=False) # Column password user = User(username="zhangsan", password="qert1234") with app.app_context(): db.create_all() ``` ### with app.app_context(): - 在 Flask 应用中, with app.app_context(): 是一个常用的模式, 用于创建并激活应用上下文(application context). - 这个上下文管理器确保在其作用域内, Flask 应用的全局变量(如 current_app)和应用级别的功能(如数据库操作)能够正常工作. - `为什么需要应用上下文`? Flask 的设计依赖于上下文来确定当前处理的请求或应用, - `何时使用`? 当你需要在 Flask 应用外部(如脚本、测试)访问应用资源时 - `作用`: 激活应用上下文,确保 current_app 和相关功能正常工作. - `最佳实践`: 使用 with 语句自动管理上下文的生命周期,避免手动调用 push() 和 pop() 方法 ### ORM 一对多 ```python class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) # varchar 100 username = db.Column(db.String(100), nullable=False) password = db.Column(db.String(100), nullable=False) class Article(db.Model): __tablename__ = 'article' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(200), ) content = db.Column(db.Text,) # Author: 设置外键 author_id = db.Column(db.Integer, db.ForeignKey('user.id'), ) # 通过 backref 自动给User绑定一个 属性 叫做 "articles", 用来获取文章列表 author = db.relationship('User',backref='articles') # by this, 就可以直接根据 user去获取所有的 articles 了 @app.route('/article/query',methods=['GET']) def query_article(): author_id = request.args.get('author_id') if not author_id: return [] user = User.query.get(int(author_id)) res = {"author": user.username,"article":[]} for article in user.articles: res["article"].append({"title":article.title,"content":article.content}) return res ``` ### flask-migrate - pip install flask-migrate ### ORM Mapping 三部曲 - 1 flask db init 只需要执行一次 - 2 flask db migrate: 识别ORM模型的改变, 生成迁移脚本 - 3 flask db upgrade: 运行迁移脚本, 同步到数据库中 ### 文件结构 - `config.py`: app 项目配置, 比如 数据库连接(`SQLALCHEMY_DATABASE_URI`) - `exts.py`: 为了解决循环引用, 定义 `db = SQLAlchemy()` - `models`: 实体类定义 - `blueprints`: 不同的路由模块 - `app.py`: - - `db.init_app(app)` => 它的作用是将 SQLAlchemy 实例(db)与 Flask 应用实例(pp)进行关联 - - `app.config.from_object(config)` => 绑定配置文件,自动读取里面的配置信息 - - `migrate = Migrate(app, db)`: 初始化 Flask-Migrate 扩展,并将其与你的 Flask 应用实例(app)和 SQLAlchemy 数据库实例(db)关联起来 - - `app.register_blueprint(xxx_bp)`: 注册业务模块路由 ### macbook run in virtual environment - cd /Users/lesliesu/PycharmProjects/flask-app-v2 - source .venv/bin/activate ### mail auth code: b1d59de3cdc3fdd4 ### 测试页面 - `http://127.0.0.1:1944/auth/mail/captcha?email=su_zhen1943@sina.com` ### install: pip install flask-wtf ### install: pip install email_validator ### href="{{ url_for("qa.public") }}" - urf_for是方法名