Quart框架教程:构建一个简单的博客系统

Quart框架教程:构建一个简单的博客系统

quart An async Python micro framework for building web applications. quart 项目地址: https://gitcode.com/gh_mirrors/qu/quart

前言

Quart是一个基于Python的异步Web框架,它兼容Flask API但支持异步操作。本教程将带领你使用Quart构建一个完整的博客系统,涵盖从项目初始化到数据库操作、模板渲染以及测试等核心功能。通过这个实践项目,你将掌握Quart框架的基本使用方法和异步Web开发的核心概念。

环境准备

在开始之前,请确保你的开发环境满足以下要求:

  1. Python 3.7或更高版本
  2. 基本的Python开发知识
  3. 了解异步编程概念(async/await)

项目初始化

我们将使用Poetry作为项目依赖管理工具,这是Python生态中一个现代化的依赖管理工具。

pip install poetry
poetry new --src blog

这个命令会创建一个名为blog的项目,采用src布局(源代码放在src目录下)。这种结构有助于保持项目整洁,避免导入冲突。

添加依赖

Quart是我们唯一的核心依赖:

poetry add quart

Poetry会自动处理依赖关系并生成lock文件,确保开发环境的一致性。

创建Quart应用

src/blog/__init__.py中创建基础应用:

from quart import Quart

app = Quart(__name__)

def run() -> None:
    app.run()

为了方便运行,我们在pyproject.toml中添加脚本配置:

[tool.poetry.scripts]
start = "blog:run"

现在可以通过以下命令启动应用:

poetry run start

数据库设计

我们选择SQLite作为数据库,因为它轻量且无需额外服务。首先创建数据库schema:

-- src/blog/schema.sql
DROP TABLE IF EXISTS post;
CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  title TEXT NOT NULL,
  'text' TEXT NOT NULL
);

在Quart应用中添加数据库支持:

from pathlib import Path
from sqlite3 import dbapi2 as sqlite3

app.config.update({
  "DATABASE": Path(app.root_path) / "blog.db",
})

def _connect_db():
    engine = sqlite3.connect(app.config["DATABASE"])
    engine.row_factory = sqlite3.Row  # 使查询返回字典式结果
    return engine

def init_db():
    db = _connect_db()
    with open(Path(app.root_path) / "schema.sql", mode="r") as file_:
        db.cursor().executescript(file_.read())
    db.commit()

添加初始化命令到pyproject.toml

[tool.poetry.scripts]
init_db = "blog:init_db"
start = "blog:run"

初始化数据库:

poetry run init_db

注意:此命令会清空现有数据。

展示博客文章

创建Jinja2模板来渲染文章列表:

<!-- src/blog/templates/posts.html -->
<main>
  {% for post in posts %}
    <article>
      <h2>{{ post.title }}</h2>
      <p>{{ post.text|safe }}</p>
    </article>
  {% else %}
    <p>No posts available</p>
  {% endfor %}
</main>

添加路由处理:

from quart import render_template, g

def _get_db():
    if not hasattr(g, "sqlite_db"):
        g.sqlite_db = _connect_db()
    return g.sqlite_db

@app.get("/")
async def posts():
    db = _get_db()
    cur = db.execute(
        """SELECT title, text
             FROM post
         ORDER BY id DESC""",
    )
    posts = cur.fetchall()
    return await render_template("posts.html", posts=posts)

这里使用了Quart的异步渲染功能,g对象用于存储请求期间的数据库连接。

创建新文章

创建表单模板:

<!-- src/blog/templates/create.html -->
<form method="POST" style="display: flex; flex-direction: column; gap: 8px; max-width:400px">
  <label>Title: <input type="text" size="30" name="title" /></label>
  <label>Text: <textarea name="text" rows="5" cols="40"></textarea></label>
  <button type="submit">Create</button>
</form>

添加路由处理:

from quart import redirect, request, url_for

@app.route("/create/", methods=["GET", "POST"])
async def create():
    if request.method == "POST":
        db = _get_db()
        form = await request.form
        db.execute(
            "INSERT INTO post (title, text) VALUES (?, ?)",
            [form["title"], form["text"]],
        )
        db.commit()
        return redirect(url_for("posts"))
    else:
        return await render_template("create.html")

这个路由处理了GET和POST两种请求方法,展示了Quart处理表单数据的方式。

测试应用

使用pytest进行测试,首先创建测试数据库fixture:

# tests/conftest.py
import pytest
from blog import app, init_db

@pytest.fixture(autouse=True)
def configure_db(tmpdir):
    app.config['DATABASE'] = str(tmpdir.join('blog.db'))
    init_db()

编写测试用例:

# tests/test_blog.py
from blog import app

async def test_create_post():
    test_client = app.test_client()
    response = await test_client.post("/create/", form={"title": "Post", "text": "Text"})
    assert response.status_code == 302
    response = await test_client.get("/")
    text = await response.get_data()
    assert b"<h2>Post</h2>" in text
    assert b"<p>Text</p>" in text

安装测试依赖:

poetry add --dev pytest-asyncio

配置pytest:

[tool.pytest.ini_options]
asyncio_mode = "auto"

运行测试:

poetry run pytest tests/

总结

通过本教程,我们完成了一个完整的博客系统开发,涵盖了:

  1. Quart应用初始化
  2. 数据库配置和操作
  3. 模板渲染
  4. 表单处理
  5. 异步测试

这个项目虽然简单,但包含了Web开发的核心要素。你可以在此基础上扩展更多功能,如用户认证、文章分类、评论系统等。Quart的异步特性使其特别适合需要高并发的应用场景。

希望这个教程能帮助你快速上手Quart框架,开启你的异步Web开发之旅!

quart An async Python micro framework for building web applications. quart 项目地址: https://gitcode.com/gh_mirrors/qu/quart

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

滑隽蔚Maia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值