[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 ...
随机推荐
- 同步IO和异步IO
链接: 同步IO和异步IO socket阻塞与非阻塞,同步与异步.I/O模型 Linux的IO系统常用系统调用及分析 linux异步IO的两种方式
- 脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律
脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律 一丶什么是ESP定律 首先我们要明白什么是壳.壳的作用就是加密PE的. 而ESP定律就是壳在加密之前,肯定会保存所有寄存器环境,而出来的时候, ...
- LESS IS MORE
学习完css部分,相信大家对通过css进行DOM元素的样式操作已经非常熟悉,也可以通过css的语法进行页面显示效果的添加和修改.如果你们对css报以崇高敬意,感觉它拯救了你的整个网页的话,其实你正在犯 ...
- 容器与Docker简介(三)Docker相关术语——微软微服务电子书翻译系列
本节列出了在更加深入Docker之前应该熟悉的术语和定义. 有关详细的定义,请参阅Docker提供的术语表. 容器镜像(Container image):具有创建容器所需要的所有依赖和信息的包. 镜像 ...
- Java基础总结--常用类以及包的访问权限
-----Object---所有类的根类1.怎么得到的:通过对所有对象不断的向上抽取共性,具备所有对象的共性的东西2.常用的方法* equals(Object obj):比较两个对象的引用是否指向同一 ...
- ajax+php(环境搭建+测试)
在学习JavaScript,jQuery的ajax部分的时候,一直不明白要如何进行,不知道服务器要怎么弄,什么都不知道,当初在学ajax的时候,除了看一下ajax的内容,实践极少,因为,不知道要怎么做 ...
- Line belt
Problem Description In a two-dimensional plane there are two line belts, there are two segments AB a ...
- LCIS(区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...
- redis源码分析之发布订阅(pub/sub)
redis算是缓存界的老大哥了,最近做的事情对redis依赖较多,使用了里面的发布订阅功能,事务功能以及SortedSet等数据结构,后面准备好好学习总结一下redis的一些知识点. 原文地址:htt ...
- 「JavaScript」同步、异步、回调执行顺序之经典闭包setTimeout分析
聊聊同步.异步和回调 同步,异步,回调,我们傻傻分不清楚, 有一天,你找到公司刚来的程序员小T,跟他说:“我们要加个需求,你放下手里的事情优先支持,我会一直等你做完再离开”.小T微笑着答应了,眼角却滑 ...