在 Flask 应用中使用 Peewee ORM 过滤路由

62 阅读1分钟

我正在构建一个类似于 StumbleUpon 的应用程序,其中内容需要按照语言和类别进行过滤。我为每种语言和类别定义了两个简单的路由,但我想知道是否可以在一个简单的路由声明中同时包含两者。为了避免混淆,我使用 Peewee 作为 ORM。

huake_00210_.jpg 以下是已定义的路由:

@app.route("/<language>")
def languages(language):
    links = []

    for contenido in models.Post.select().where(models.Post.language**language):
        links.append(contenido.content)

    iframe = random.choice(links)
    return render_template('language.html', iframe=iframe, language=language)


@app.route("/<category>")
def categories(category):
    links = []

    for contenido in models.Post.select().where(models.Post.category**category):
        links.append(contenido.content)

    iframe = random.choice(links)
    return render_template('category.html', iframe=iframe, category=category)

models.py

class Post(Model):
    timestamp = DateTimeField(default=datetime.datetime.now)
    user = ForeignKeyField(
        rel_model=User,
        related_name='posts'
    )
    language = TextField()
    category = TextField()
    content = TextField()

    class Meta:
        database = DATABASE

我想在导航功能中建立语言和/或类别的关系。是否可以创建类似下面的东西?我其实在尝试实现这样的东西时感到非常困惑。目前,我有一些可能与我想做的内容有点相似的东西,这是代码片段:

@app.route("/<language>/<category>")
def mixin(language, category):
    language_links = []
    category_links = []

    for contenido in models.Post.select().where(models.Post.language**language):
        language_links.append(contenido.content)

    for contenido in models.Post.select().where(models.Post.category**category):
        category_links.append(contenido.content)


    if category_links == []:
        iframe = random.choice(language_links)
    else:
        iframe = random.choice(category_links)

    return render_template('language.html', iframe=iframe, language=language, category=category)

2、解决方案

为了在 Flask 应用中使用 Peewee ORM 过滤路由,可以采用以下步骤:

  1. 首先,导入必要的模块:
from peewee import *
from flask import Flask, render_template, request
  1. 接下来,创建一个 Flask 应用:
app = Flask(__name__)
  1. 然后,定义要过滤的模型:
class Post(Model):
    timestamp = DateTimeField(default=datetime.datetime.now)
    user = ForeignKeyField(
        rel_model=User,
        related_name='posts'
    )
    language = TextField()
    category = TextField()
    content = TextField()

    class Meta:
        database = DATABASE
  1. 接下定义要过滤的路由:
@app.route("/<language>/<category>")
def mixin(language, category):
    language_links = []
    category_links = []

    for contenido in models.Post.select().where(models.Post.language**language):
        language_links.append(contenido.content)

    for contenido in models.Post.select().where(models.Post.category**category):
        category_links.append(contenido.content)


    if category_links == []:
        iframe = random.choice(language_links)
    else:
        iframe = random.choice(category_links)

    return render_template('language.html', iframe=iframe, language=language, category=category)
  1. 最后,运行 Flask 应用:
if __name__ == "__main__":
    app.run(debug=True)