作者:hhh5460

官网有一个flaskr的例子,按照其8个步骤(包括测试),一步一步照着做,有3个地方报错。

究其原因,可能是flaskr这个例子年代比较久远,而现在python以及flask都有了很大的变动。

我的环境:win7(64) + python 3.5(64)

这里只直接贴出修改后的代码(出错的地方被注释了)。

其中flaskr.py2处报错:

# flaskr.py

# 所有的导入
import sqlite3
from flask import Flask, request, session, g, redirect, url_for, \
abort, render_template, flash # 配置
# DATABASE = '/tmp/flaskr.db' # 报错1: sqlite3.OperationalError: unable to open database file
import os
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
DATABASE = os.path.join(PROJECT_ROOT, 'tmp', 'flaskr.db') # 改正1:不把路径写死
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default' # 创建我们的小程序
app = Flask(__name__)
app.config.from_object(__name__) # from_object() 将会寻找给定的对象(如果它是一个字符串,则会导入它),
# 搜寻里面定义的全部大写的变量。 def connect_db():
return sqlite3.connect(app.config['DATABASE']) from contextlib import closing
def init_db():
with closing(connect_db()) as db:
with app.open_resource('schema.sql') as f:
#db.cursor().executescript(f.read()) # 报错2: ValueError: script argument must be unicode
db.cursor().executescript(f.read().decode()) # 改正2:加了decode()
db.commit() @app.before_request
def before_request():
g.db = connect_db() @app.teardown_request
def teardown_request(exception):
g.db.close() #四个视图函数:
# 1.显示条目
@app.route('/')
def show_entries():
cur = g.db.execute('select title, text from entries order by id desc')
entries = [dict(title=row[0], text=row[1]) for row in cur.fetchall()]
return render_template('show_entries.html', entries=entries) # 2.添加新条目
@app.route('/add', methods=['POST'])
def add_entry():
if not session.get('logged_in'):
abort(401)
g.db.execute('insert into entries (title, text) values (?, ?)',
[request.form['title'], request.form['text']])
g.db.commit()
flash('New entry was successfully posted')
return redirect(url_for('show_entries')) # 3.登录
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != app.config['USERNAME']:
error = 'Invalid username'
elif request.form['password'] != app.config['PASSWORD']:
error = 'Invalid password'
else:
session['logged_in'] = True
flash('You were logged in')
return redirect(url_for('show_entries'))
return render_template('login.html', error=error) # 4.注销
@app.route('/logout')
def logout():
session.pop('logged_in', None)
flash('You were logged out')
return redirect(url_for('show_entries')) if __name__ == '__main__':
app.run()

另,测试文件flaskr_test.py1处报错:

import os
import flaskr
import unittest
import tempfile class FlaskrTestCase(unittest.TestCase): def setUp(self):
self.db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp()
flaskr.app.config['TESTING'] = True
self.app = flaskr.app.test_client()
flaskr.init_db() def tearDown(self):
os.close(self.db_fd)
os.unlink(flaskr.app.config['DATABASE']) # 测试1:访问应用程序的根目录(/)
def test_empty_db(self):
rv = self.app.get('/')
#assert 'No entries here so far' in rv.data # 报错3:TypeError: a bytes-like object is required, not 'str'
assert b'No entries here so far' in rv.data # 改正3:文字修改为byte类型(或者rv.data修改为rv.data.decode()),以下都要同样修改!! def login(self, username, password):
return self.app.post('/login', data=dict(username=username, password=password), follow_redirects=True) def logout(self):
return self.app.get('/logout', follow_redirects=True) # 测试2:登录和注销
def test_login_logout(self):
rv = self.login('admin', 'default')
assert b'You were logged in' in rv.data
rv = self.logout()
assert b'You were logged out' in rv.data
rv = self.login('adminx', 'default')
assert b'Invalid username' in rv.data
rv = self.login('admin', 'defaultx')
assert b'Invalid password' in rv.data # 测试3:添加新条目
def test_messages(self):
self.login('admin', 'default')
rv = self.app.post('/add', data=dict(title='<Hello>', text='<strong>HTML</strong> allowed here'), follow_redirects=True)
assert b'No entries here so far' not in rv.data
assert b'&lt;Hello&gt;' in rv.data
assert b'<strong>HTML</strong> allowed here' in rv.data if __name__ == '__main__':
unittest.main()

效果图

flaskr 报错及其修改的更多相关文章

  1. Dynamics CRM 打开数据加密报错及修改用户邮件保存报错的解决方法

    在项目里会碰到在修改用户的电子邮件时报错的问题 然后跑到数据管理里打开数据加密又是报错 解决上述问题只需要做下数据库的更改即可,把标志位置1即可,记得要重启下IIS才能生效 SELECT [Colum ...

  2. JPA报错问题修改小结

    项目中在使用线程跑定时任务时,遇到报错,"Could not open JPA EntityManager for transaction Caused by: org.hibernate. ...

  3. RocketMQ_问题_启动报错,修改堆内存大小

    1.启动broker报错 虚拟机内存小,导致虚拟机中的JVM内存小,进而在启动broker时分配JVM内存遇到问题 查询网上得知,查看/usr/local/rocketmq-all-4.3.0/dis ...

  4. linux下mysql安装报错及修改密码登录等等

    1:下载 [root@localhost soft]# wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.19-linux-glibc ...

  5. python踩坑系列——报错后修改了.py文件,但是依然报错

    一开始.py文件中的函数名大小写错了,但是在终端是对的,报错: 'module' object has no attribute '某函数名' 后来就去修改.py文件.结果重新import该.py文件 ...

  6. Windows下MySQL安装流程,8.0以上版本ROOT密码报错及修改

    官网下载MySQL安装后,解压,添加环境变量,以管理员方式运行cmd,运行以下命令 mysqld --initialize --console mysqld -install net start my ...

  7. JPA连接PG数据库时间类型查询报错的修改

    PG数据库中的时间格式规范: https://blog.csdn.net/sky_limitless/article/details/79527665 to_data 转换为 普通的时间格式 to_t ...

  8. MYSQL8.0以上版本ROOT密码报错及修改

    在登录数据库过程中,如果遇到忘记root密码时,该如何解决? 1.使用管理员权限打开命令提示符,在命令行中输入: net stop mysql  2.待mysql服务停止后,输入: mysqld -- ...

  9. mysql小知识点汇总---(时间与时间戳的转换, 修改mysql用户名密码, navicate 导入sql文件报错 1153)

    1. 时间与时间戳的转换 1.1 时间戳转时间 FROM_UNIXTIME(add_time, '%Y-%m-%d') 1.2 时间转时间戳 UNIX_TIMESTAMP('2015-04-29') ...

随机推荐

  1. 【jdk源码1】TreeMap源码学习

    这是看过的第一个jdk源码(从立下目标以来):TreeMap.说实话断断续续的看了有好几天了,我觉得我犯了一个错误,就像一开始说的那样,我打算完完全全看懂TreeMap关于红黑树的实现方式,后来我想了 ...

  2. excel文件使用navicat工具导入mysql的方法

    1.在excel文件的sheet上,第1行下面插入一行,对应DB里面的字段名称,方便后面导入时做字段匹配: 2.使用Navicat ,打开工具,选择表所在的数据库,然后点击数据库名字,右键Tables ...

  3. 系统监控工具-glances

    作为运维不仅要时时监控系统,还需要优雅的装13,当别人还在命令的小黑框里敲打那个top命令去查看系统性能的时候,我们带你使用web端监控系统性能 glances 是利用Python语言开发,的监控工具 ...

  4. ESXI6.0新添加硬盘未能格式化成功

    最近练手,手头现有的硬盘是从其他机器上拆下来的,插入ESXI主机上,然后在系统配置硬盘的时候,不能格式化 报错 提示如下错误:"在ESXi"xxx.xxx.xxx.xxx" ...

  5. XtraEditors七、ProgressBarControl、MarqueeProgressBarControl、ProgressPanel控件

    一.ProgressBarControl 进度条控件 效果如下: 示例代码: using System; using System.Collections.Generic; using System. ...

  6. 团队作业——Alpha冲刺 11/12

    团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:预览界面布局实现,并留下交互接口 明日任务:预览界面中自定义保存的实现 郭剑南 今日任务:尝试解决Python编写程序无法在Android ...

  7. 让sublime text3支持Vue语法高亮显示[转]

    1.准备语法高亮插件vue-syntax-highlight. 下载地址:https://github.com/vuejs/vue-syntax-highlight 下载页面并下载: 解开压缩包vue ...

  8. jQuery----各版本

    jQuery是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作.由John Resig在2006年1月的BarCamp NYC上发布第一个版本.目前是由 Dave M ...

  9. Python基础5

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  10. 【洛谷】【单调栈】P1901 发射站

    [题目描述:] 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发 ...