---------------------------------------------以下内容2017.7.14更新-----------------------------------------------------

flask web(封面上是一条狗)这本书前7章讲了flask的基本概念,在第8章开始逐渐实现一个博客网站,建议读者从这一章开始创建自己的工程,跟着书中的进度迭代自己的博客网站,而不是直接使用git clone命令从作者的示例程序中checkout当前版本,这样做会遇到一些莫名其妙的问题。

切入正题,第11章直接checkout 11a,配置好环境变量,在Terminal中upgrade数据库,用runserver参数执行manage.py,打开网站,然后注册帐号,验证,登录,最后你会发现主页上并没有文章表单,也没有作者的那句“What's on your mind?”。

原因在于:即使upgrade了数据库,但当前的数据库中没有角色实例,也就是说你注册的账户(即使是用程序中指定的邮箱注册的管理员账户)没有对应的角色的权限,因此就无法看到提示/输入框/提交按钮。下面是关于该文章表单的HTML代码,位于app/templates/index.html:

 <div>
{% if current_user.can(Permission.WRITE_ARTICLES) %}
{{ wtf.quick_form(form) }}
{% endif %}
</div>

可以看到,只有当前登录的账户拥有“写文章”的权限,才向你展示写文章的表单。

解决办法:需要向数据库中添加角色,再进行注册/验证/登录,这样就拥有了写文章的权限。在书中第99页中间部分写的很清楚,insert_roles函数并不直接创建新角色对象,而是查找现有角色,再进行更新。这是作者为了将来拓展角色类别(比如对普通用户再进行细分)而进行的处理。下面紧接着写着:如果想把角色(指的是之前提到的用户/协管员/管理员这三个角色)写入数据库,需要使用shell会话

>>>Role.insert_roles()

>>>Role.query.all()

来对数据库中的角色进行更新,这样数据库中就有了上述三个角色。这时注册的账户就都有了对应的角色,比如你使用程序中的Flask Admin静态变量指定的邮箱注册,那么该账户自动成为管理员账户,拥有修改其他账户资料的权限。

下面是数据库模型中User类的构造函数,可以看出当账户的角色为空的时候,分支语句选择给账户绑定管理员角色或者默认角色,这里的前提是数据库中有角色,如果数据库中没有角色,就无法赋予账户对应的角色,也就没法让账户得到该有的权限,结果就是没有权限的账户看不到写文章的表单,实际上这时看到的内容只包括那些不需要任何权限的内容,比如导航栏/登录/注册这些内容。

     def __init__(self, **kwargs):
super(User, self).__init__(**kwargs)
if self.role is None:
if self.email == current_app.config['FLASKY_ADMIN']:
self.role = Role.query.filter_by(permissions=0xff).first()
if self.role is None:
self.role = Role.query.filter_by(default=True).first()
if self.email is not None and self.avatar_hash is None:
self.avatar_hash = hashlib.md5(
self.email.encode('utf-8')).hexdigest()

我的环境是ubuntu16.04,使用集成开发环境pycharm,flask框架常常需要导入大量的依赖包,只需在pycharm内置的terminal中执行sudo apt-get install -r requirements/xxx.txt(xxx是包名=版本号的序列文本)即可安装所有依赖包,如果读者不查资料的话,可能读到本书203页第18章才能找到关于适合flask框架的集成开发环境的介绍,如果此前一直使用文本和终端命令进行学习,那就太辛苦了。

[flask/python/web] 解析flask web开发(Miguel著)一书第11章主页不显示博文表单的问题的更多相关文章

  1. Flask源码解析:Flask应用执行流程及原理

    WSGI WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述服务器端如何与web应用程序通信的 ...

  2. 用 Flask 来写个轻博客 (19) — 以 Bcrypt 密文存储账户信息与实现用户登陆表单

    目录 目录 前文列表 修改 User Model Flask Bcrypt 将 Bcrypt 应用到 User Model 中 创建登陆表单 前文列表 用 Flask 来写个轻博客 (1) - 创建项 ...

  3. 开发测试技巧|辅助开发调试:goolge浏览器利用F12在控制台输入脚本实现表单自动填充

    一个开发测试技巧的指引和截图,利用google浏览器的F12调试和Console执行,注入JavaScript脚本实现表单的自动填充和测试. 原文链接: http://www.lookdaima.co ...

  4. Flask源码解析:Flask上下文

    一.上下文(Context) 什么是上下文: 每一段程序都有很多外部变量.只有像Add这种简单的函数才是没有外部变量的.一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行.你为了使他们运行, ...

  5. Flask:web表单

    客户端发送的所有通过POST发出的请求信息都可以通过request.form获取.但是如果我们要生成表单的HTML代码和验证提交的表单数据那么就需要采用另外的方法.Flask-WTF扩展可以把处理we ...

  6. python 全栈开发,Day111(客户管理之 编辑权限(二),Django表单集合Formset,ORM之limit_choices_to,构造家族结构)

    昨日内容回顾 1. 权限系统的流程? 2. 权限的表有几个? 3. 技术点 中间件 session orm - 去重 - 去空 inclusion_tag filter 有序字典 settings配置 ...

  7. web.input()和web.data() 遇到特殊字符

    使用web.py的时候,web.input()和web.data() 都可以接收用户从浏览器端输入的参数. web.input()方法返回一个包含从url(GET方法)或http header(POS ...

  8. 第四章 Web表单

    4.1 跨站请求伪造保护 安装flask-wtf app = Flask(__name__) app.config['SECRET_KEY'] = 'hard to guess string' 密钥不 ...

  9. Flask 扩展 表单

    pip install flask-wtf 一个简单的表单 from flask_wtf import Form from wtforms import StringField from wtform ...

随机推荐

  1. git上传遇到 GitHub could not read Username 的解决办法

    Gitversion 1.8.5.2 执行git push命令异常,如下: Push failed Failed with error: unable to read askpass response ...

  2. clone对象

    在JavaScript中,当对象作为参数传给函数的时候,在函数内部对这个对象的属性进行修改时,函数外部的对象属性也会跟着被修改,而有些时候我们并不想原来的对象数据发生改变,这时候就需要切断对象之间的引 ...

  3. xmanager 打开centos7图形化窗口

    centos7 最小化安装后,个别时候需要执行一些带图形界面的命令.比如安装oracle,打开xclock等. 前置条件:centos7系统 ,xmanager 已安装 用xclock做测试 1.因为 ...

  4. inline的C99标准相关原文

    WG14/N1256 Annex J (informative) Portability issues J.1 Unspecified behavior Whether a call to an in ...

  5. Web性能测试工具之ab入门篇

    1. ab简介 ab全称Apache Bench,是apache附带的一个小工具,它可以同时模拟多个并发请求,测试apache等Web服务器的最大负载压力. 本文通过一个简单的示例,介绍了使用ab进行 ...

  6. Xilinx ISE 14.1中模拟True Dual Port RAM例子

    <一>创建工程 创建工程在此略过. <二>基本代码 1.创建一个Verilog modual代码如下: module main( input clk, input rsta, ...

  7. Windows环境下多线程编程原理与应用读书笔记(4)————线程间通信概述

    <一>线程间通信方法 全局变量方式:进程中的线程共享全局变量,可以通过全局变量进行线程间通信. 参数传递法:主线程创建子线程并让子线程为其服务,因此主线程和其他线程可以通过参数传递进行通信 ...

  8. 【JAVA零基础入门系列】Day14 Java对象的克隆

    今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢 ...

  9. BootStrap Table使用小结

    1.在当前表格的最后新增数据 $("#data_module_table").bootstrapTable('append', data.data);//data.data---- ...

  10. JAVA提高十二:HashMap深入分析

    首先想说的是关于HashMap源码的分析园子里面应该有很多,并且都是分析得很不错的文章,但是我还是想写出自己的学习总结,以便加深自己的理解,因此就有了此文,另外因为小孩过来了,因此更新速度可能放缓了, ...