[flask/python/web] 解析flask web开发(Miguel著)一书第11章主页不显示博文表单的问题
---------------------------------------------以下内容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章主页不显示博文表单的问题的更多相关文章
- Flask源码解析:Flask应用执行流程及原理
WSGI WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述服务器端如何与web应用程序通信的 ...
- 用 Flask 来写个轻博客 (19) — 以 Bcrypt 密文存储账户信息与实现用户登陆表单
目录 目录 前文列表 修改 User Model Flask Bcrypt 将 Bcrypt 应用到 User Model 中 创建登陆表单 前文列表 用 Flask 来写个轻博客 (1) - 创建项 ...
- 开发测试技巧|辅助开发调试:goolge浏览器利用F12在控制台输入脚本实现表单自动填充
一个开发测试技巧的指引和截图,利用google浏览器的F12调试和Console执行,注入JavaScript脚本实现表单的自动填充和测试. 原文链接: http://www.lookdaima.co ...
- Flask源码解析:Flask上下文
一.上下文(Context) 什么是上下文: 每一段程序都有很多外部变量.只有像Add这种简单的函数才是没有外部变量的.一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行.你为了使他们运行, ...
- Flask:web表单
客户端发送的所有通过POST发出的请求信息都可以通过request.form获取.但是如果我们要生成表单的HTML代码和验证提交的表单数据那么就需要采用另外的方法.Flask-WTF扩展可以把处理we ...
- python 全栈开发,Day111(客户管理之 编辑权限(二),Django表单集合Formset,ORM之limit_choices_to,构造家族结构)
昨日内容回顾 1. 权限系统的流程? 2. 权限的表有几个? 3. 技术点 中间件 session orm - 去重 - 去空 inclusion_tag filter 有序字典 settings配置 ...
- web.input()和web.data() 遇到特殊字符
使用web.py的时候,web.input()和web.data() 都可以接收用户从浏览器端输入的参数. web.input()方法返回一个包含从url(GET方法)或http header(POS ...
- 第四章 Web表单
4.1 跨站请求伪造保护 安装flask-wtf app = Flask(__name__) app.config['SECRET_KEY'] = 'hard to guess string' 密钥不 ...
- Flask 扩展 表单
pip install flask-wtf 一个简单的表单 from flask_wtf import Form from wtforms import StringField from wtform ...
随机推荐
- Oracle学习笔记之用户自定义函数
自定义函数语法格式: 用户自定义的函数,可以直接在sql语句中直接调用,并且任何一个funciton都必须有返回值,而且该函数声明后,是保存在数据端的,我们随时可以使用:注意:函数只能有一个返回值 ...
- Linux入门(3)——Ubuntu16.04下安装VMware
下载linux版本 http://www.vmware.com/cn/products/workstation/workstation-evaluation.html 激活秘钥:5A02H-AU243 ...
- LINUX 笔记-date命令
显示当前时间: 命令: focus@ubuntu:~$ date Thu Aug 31 03:01:17 PDT 2017 focus@ubuntu:~$ date '+%x' 08/31/2017 ...
- javascript方法的方法名慎用close
通常我们在定义了与window同名的方法时,会自动覆盖掉window同名的方法.close()方法也不例外.示例: <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- Windows下使用nginx搭建反向代理服务器
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时 ...
- Nodejs.安装.非源码方式安装Node.js (Centos)
已验证的适用环境: Centos6.x 树莓派官方ROM(Raspbian) 先去官网下载已编译好的安装包 https://nodejs.org/en/download/current/ 以Cent ...
- json_encode()中文不转码
php使用json_encode()把数组转换为json的时候,总会把中文进行转码,转码后从json数据上我们无法看出其中的中文文字.php5.4以后,当json_encode()的第二个参数赋值为J ...
- Python中subplots_adjust函数的说明
使用subplots_adjust一般会传入6个参数,我们分别用A,B,C,D,E,F表示.然后我们对图框建立坐标系,将坐标轴原点定在左下角点,并将整个图框归一化,即横纵坐标都是0到1之间.从下图中可 ...
- KMP (next数组的性质及证明)
性质:如果len%(len-next[len-1])==0,则字符串中必存在最小循环节,且循环次数即为len/(len-next[len-1]); 证明:在前len个字符组成的字符串,存在最小循环节k ...
- windows 上rsync客户端使用方法
1.1 获取 windows上实现rsync的软件(cwRsync) cwRsync是Windows 客户端GUI的一个包含Rsync的包装.您可以使用cwRsync快速远程文件备份和同步. 1.1. ...