2

我正在使用 python 中的 Flask 框架创建一个博客。

我有以下用于显示帖子的视图/网址:

    @post_blueprint.route('/post/<int:year>/<int:month>/<title>', methods=['GET'])
    def get_post(year, month, title):
    try:
        title = title.replace('-', ' ')
        post = Post.query.filter(Post.title == title).one()
        post.comment_form = UserCommentForm()
    except NoResultFound:
        raise
    return render_template('show_single_post.html', post=post)

在上面的代码中,我还传递了一个评论表单,让用户发表评论。之后,我编写了用于接收此帖子请求的视图/网址:

    @post_blueprint.route('post/<int:post_id/comment/add/', mehtods=['POST'])
    def add_comment(post_id):
        post = Post.query.get(post_id)
        if not post:
            raise Exception
        if request.method == 'POST':
            form = UserCommentForm(request.form)
            if form.validate():
            try:
               user = User.query.\
                    filter(User.email == form.email.data).one()
            except NoResultFound:
               user = User(form.username.data, form.email.data,
                        form.website.data or None)

            try:
                comment = Comment(form.comment.data, post_id)
                comment.author = user
                db_session.add(comment)
                db_session.commit()
            except IntegrityError:
                 raise

            return redirect(url_for('.get_post', year=post.posted_on.year,
                                                 month=post.posted_on.month,
                                                 title=post.title.replace(' ','-')
                                    )
                            )

在上面的视图中,我正在从 db 访问 post 对象以确保 post 存在。如果用户不存在,我创建用户,然后保存评论。

现在我的问题不是访问完整的 Post 对象,我可以通过运行计数查询来简单地测试 post 的存在,但是由于我需要 post 属性,所以我必须获取完整的对象。

在我看来,也许我的 url 方案不是那么好,或者这里可以做一些更好的事情!

谁能告诉我这是否以及如何改进?

4

1 回答 1

0

您的 url 架构没问题,应该适用于搜索引擎。您可以在Flask-SQLAlchemy中使用这样的查询:

title, posted_on = Post.query.get_or_404(post_id).values(Post.title, Post.posted_on)

我云没有测试它,但它应该可以工作并通过不存在的帖子引发 HTTP 404 错误。此外,应该只转移所有权和posted_on 数据而没有完整的过帐。

于 2012-07-24T11:17:24.610 回答