你如何重击网址?

时间:2016-11-07 04:04:31

标签: python flask slug

我正在使用slugify,我不知道如何让我的帖子标题更加强化,我是否需要在帖子中创建一个新专栏?我整天都被困在这里。

有什么建议吗?

Views.py

@app.route('/posts/<title>')
@login_required
def show(title):

    link = db.session.query(Post).filter_by(title = title).one()
    link2 = slugify(link.title)

    return render_template("post.html", post=link2,  pid=id, title=link2)

Models.py

class Post(db.Model):
    __tablename__ = "posts"
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80))
    body = db.Column(db.Text)




    def __init__(self, title, body):
        self.title = title
        self.body = body

错误消息

  File "C:\Program Files\Python35-32\lib\site-packages\sqlalchemy\orm\query.py", line 2760, in one
    raise orm_exc.NoResultFound("No row was found for one()")
sqlalchemy.orm.exc.NoResultFound: No row was found for one()

2 个答案:

答案 0 :(得分:2)

您在视图和查询数据库中根据slug取slug而不是title。在创建帖子时slugify标题并将其存储在slug字段中。

<强> Views.py

@app.route('/posts/<slug>')
@login_required
def show(slug):
    post = db.session.query(Post).filter_by(slug = slug).first()
    if post:
        return render_template("post.html", post=post)

    abort(404)

请注意,我们在这里使用的是.first而不是.one,因为如果找不到帖子,.first会返回None,而.one会引发您需要的异常根据它捕捉和流动。

如果找不到帖子,我们将返回404

Models.py

class Post(db.Model):
    __tablename__ = "posts"
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80))
    body = db.Column(db.Text)
    slug = db.Column(db.String(80), index=True)

    def __init__(self, title, body):
        self.title = title
        self.body = body
        self.slug = slugify(title)

答案 1 :(得分:1)

我的猜测是你正在使用#34等帖子的标题;这是我的第一篇博客文章&#34;这很棒。我也猜测你想要使用slug,以便为每个帖子提供更友好的URL永久链接。在之前的案例中,slug会像&#34;这是我的第一篇博客文章&#34;

所以给了一个slug,你的帖子可以在/ posts / {unique-post-slug}路线上找到,而不是/ posts / {title}。我的建议是将slug存储在数据库中以便检索帖子,因为反向slugify并不那么容易。

总结你的模型应该是:

class Post(db.Model):
    __tablename__ = "posts"

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80))
    body = db.Column(db.Text)
    slug = db.Column(db.Text, index=True)

    def __init__(self, title, body):
        self.title = title
        self.body = body
        self.slug = slugfiy(title)

请注意index=True选项。这样做是为了加快查询速度。

应该发布你的帖子的路线是

@app.route('/posts/<slug>')
@login_required
def show(slug):

    post = db.session.query(Post).filter_by(slug=slug).one()

    return render_template("post.html", post=post)

在你的post.html文件中,你可以使用post.id,post.title等所有帖子字段(id,title,body,slug)