用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单

简介: 目录目录前文列表实现 post 视图函数在 posthtml 中添加表单效果前文列表用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3...

目录

前文列表

用 Flask 来写个轻博客 (1) — 创建项目
用 Flask 来写个轻博客 (2) — Hello World!
用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)
用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)
用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级
用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览
用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法
用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数
用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板
用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验
用 Flask 来写个轻博客 (14) — M(V)C_实现项目首页的模板

实现 post() 视图函数

  • views.py
    在原有的基础上对视图函数 post() 进行修改.
from uuid import uuid4
import datetime

from forms import CommentForm

@app.route('/post/<string:post_id>', methods=('GET', 'POST'))
def post(post_id):
    """View function for post page"""

    # Form object: `Comment`
    form = CommentForm()
    # form.validate_on_submit() will be true and return the
    # data object to form instance from user enter,
    # when the HTTP request is POST
    if form.validate_on_submit():
        new_comment = Comment(id=str(uuid4()),
                              name=form.name.data)
        new_comment.text = form.text.data
        new_comment.date = datetime.datetime.now()
        new_comment.post_id = post_id
        db.session.add(new_comment)
        db.session.commit()

    post = Post.query.get_or_404(post_id)
    tags = post.tags
    comments = post.comments.order_by(Comment.date.desc()).all()
    recent, top_tags = sidebar_data()

    return render_template('post.html',
                           post=post,
                           tags=tags,
                           comments=comments,
                           form=form,
                           recent=recent,
                           top_tags=top_tags)

NOTE: CommentForm 类是在 用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验 中定义的, 需要将其导入到该模块中.

  • 需要在视图函数 post() 中添加接收 HTTP POST 请求, 路由方法 route() 默认只接收 HTTP GET 请求.

  • 在视图函数中创建一个 form 对象, 并以此来获取用户在输入框中输入的数据对象.

  • form.validata_on_submit() 方法会隐式的判断该 HTTP 请求是不是 POST, 若是, 则将请求中提交的表单数据对象传入上述的 form 对象并进行数据检验.

  • 若提交的表单数据对象通过了 form 对象的检验, 则 form.validata_on_submit() 返回为 True 并且将这些数据传给 form 对象, 成为其实例属性.

  • 之后我们就能够通过表单对象 form 来调用其实例属性, 并且赋值给 models 对象, 最后存入到数据库中.

  • 最后, 因为在 post.html 页面需要显示这些评论, 所以该模板文件也需要传入 form 对象含有的实例属性值, 那么我们直接在视图函数 post() 中 直接将 form 对象传入到 render_template() 就好了.

在 post.html 中添加表单

{% extends "base.html"%}
{% block title %}{{ post.name }}{% endblock %}

<!-- Replace the BODY of template base.html -->
{% block body %}
<h3>{{ post.title }}</h3>
{{ post.publish_date }}:
{{ post.text }}

<div class="col-lg-12">
  <h3>New Comment:</h3>
  <!-- Set the form -->
  <form method="POST" action="{{ url_for('post', post_id=post.id)
    }}">
    {{ form.hidden_tag() }}
    <div>
      <!-- Field: `name` label -->
      {{ form.name.label }}
      {% if form.name.errors %}
        {% for e in form.name.errors %}
          <p class="help-block">{{ e }}</p>
        {% endfor %}
      {% endif %}
      {{ form.name(class_="form-control") }}
    </div>
    <div class="form-group">
      {{ form.text.label }}
      {% if form.text.errors %}
        {% for e in form.text.errors %}
          <p class="help-block">{{ e }}</p>
        {% endfor %}
      {% endif %}
      {{ form.text(class_='form-control') }}
    </div>
    <input class="btn btn-primary" type="submit" value="Add Comment">
  </form>
</div>
{% endblock %}
  • form.hidden_tag(): 提供了预防跨站请求伪造的机制, 常用于表单页面
  • field.errors: 列表类型, 用于显示验证失败后的提示信息
  • {{ form.name(class_="form-control") }}: 把字段本身作为方法调用, 会渲染作用于该字段的的 HTML 代码.
  • field.label: 为输入框生成对应的 label 标签的 HTML 代码.

效果

这里写图片描述

查看是否写入到了数据库:

mysql> select * from comments where name='jmilkfan';
+--------------------------------------+----------+------+---------------------+--------------------------------------+
| id                                   | name     | text | date                | post_id                              |
+--------------------------------------+----------+------+---------------------+--------------------------------------+
| 0cea03ec-76b4-4ba4-b781-6a0bf056078b | jmilkfan | HI   | 2016-11-25 17:21:05 | 35c8b4f3-c231-4b32-b139-f7647714b87e |
+--------------------------------------+----------+------+---------------------+--------------------------------------+
1 row in set (0.00 sec)

ERROR LOG:

(env)fanguiju@fanguiju:/opt/JmilkFan-s-Blog$ python manage.py server
/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.script is deprecated, use flask_script instead.
  .format(x=modname), ExtDeprecationWarning
/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.migrate is deprecated, use flask_migrate instead.
  .format(x=modname), ExtDeprecationWarning
/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.sqlalchemy is deprecated, use flask_sqlalchemy instead.
  .format(x=modname), ExtDeprecationWarning
/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.
  warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.')
Traceback (most recent call last):
  File "manage.py", line 35, in <module>
    manager.run()
  File "/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask_script/__init__.py", line 412, in run
    result = self.handle(sys.argv[0], sys.argv[1:])
  File "/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask_script/__init__.py", line 383, in handle
    res = handle(*args, **config)
  File "/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask_script/commands.py", line 425, in __call__
    **self.server_options)
  File "/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/flask/app.py", line 843, in run
    run_simple(host, port, self, **options)
  File "/opt/JmilkFan-s-Blog/env/local/lib/python2.7/site-packages/werkzeug/serving.py", line 677, in run_simple
    s.bind((hostname, port))
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use

TSG: 在该运行的环境中, Server() 默认的 IP 或 PORT 被占用了. 所以在 manage.py 中手动的设定其 IP 或 PORT.

manager.add_command("server", Server(host='127.0.0.1', port=8089))
相关文章
|
7月前
|
JSON 前端开发 数据安全/隐私保护
通过一个form表单的渲染演示,Flask的request,重定向语法
通过一个form表单的渲染演示,Flask的request,重定向语法
57 0
通过一个form表单的渲染演示,Flask的request,重定向语法
|
Python
Python:Flask自动刷新页面livereload
Python:Flask自动刷新页面livereload
727 0
|
7月前
|
前端开发 安全 JavaScript
Python的Flask框架的学习笔记(前后端变量传送,文件上传,网页返回)内含实战:实现一个简单的登录页面
Python的Flask框架的学习笔记(前后端变量传送,文件上传,网页返回)内含实战:实现一个简单的登录页面
178 0
|
4月前
|
前端开发 Python
使用 Flask 3 搭建问答平台(三):注册页面模板渲染
使用 Flask 3 搭建问答平台(三):注册页面模板渲染
|
7月前
|
存储 移动开发 JavaScript
Flask狼书笔记 | 04_表单
4 表单 表单是和用户交互最常见的方式之一,本章涉及的Python包由WTForms、Flask-WTF、Flask-CKEditor。(p104) 4.1 HTML表单
68 0
|
7月前
|
数据库 数据安全/隐私保护 开发者
WTForms在Flask中的应用:创建与验证表单
【4月更文挑战第16天】本文介绍了如何在Flask应用中使用WTForms进行表单处理。首先,通过`pip install WTForms`安装库,并在配置文件中启用CSRF保护。接着,创建表单类,如`RegistrationForm`,包含所需字段及验证规则。在视图函数中处理表单提交,验证数据并进行相应操作。最后,在模板中渲染表单,显示标签、输入字段及验证错误信息。WTForms提供便捷的表单创建和验证,增强应用交互性和安全性。
|
7月前
|
数据库 数据安全/隐私保护 开发者
Flask表单处理:让Web交互更轻松
【4月更文挑战第16天】本文介绍了Flask中处理表单的基本流程和实用技巧。使用Flask-WTF扩展创建表单类,如`RegistrationForm`,包含字段及验证器。在模板中渲染表单,接收并处理数据,如`register`视图函数中的`form.validate_on_submit()`。技巧包括自定义验证器、CSRF保护、动态表单字段和文件上传。Flask-WTF使Web交互更便捷,增强了安全性与灵活性。
|
7月前
|
开发框架 安全 搜索推荐
如何使用Python Flask发布web页面至公网并实现远程访问【内网穿透】
如何使用Python Flask发布web页面至公网并实现远程访问【内网穿透】
|
7月前
|
Python
在Flask中,如果你想设置响应返回的HTML页面
【1月更文挑战第4天】【1月更文挑战第16篇】在Flask中,如果你想设置响应返回的HTML页面
89 1
|
7月前
|
前端开发 Python
Web 框架 Flask 快速入门(二)表单
🌴 表单 1、表单介绍 当我们在网页上填写账号密码进行登录的时候,就是在填写一个“表单”。web表单是web应用程序种最基本的功能。 2、表单的简单实现 下面的代码实现了这样的功能:
77 0