# 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是方法名