flaskr 报错及其修改
作者:hhh5460
官网有一个flaskr的例子,按照其8
个步骤(包括测试),一步一步照着做,有3
个地方报错。
究其原因,可能是flaskr这个例子年代比较久远,而现在python以及flask都有了很大的变动。
我的环境:win7(64) + python 3.5(64)
这里只直接贴出修改后的代码(出错的地方被注释了)。
其中flaskr.py
有2
处报错:
# 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 unicodedb.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 = Noneif 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'] = Trueflash('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.py
有1
处报错:
import os
import flaskr
import unittest
import tempfileclass FlaskrTestCase(unittest.TestCase):def setUp(self):self.db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp()flaskr.app.config['TESTING'] = Trueself.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.datarv = self.logout()assert b'You were logged out' in rv.datarv = self.login('adminx', 'default')assert b'Invalid username' in rv.datarv = 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.dataassert b'<Hello>' in rv.dataassert b'<strong>HTML</strong> allowed here' in rv.dataif __name__ == '__main__':unittest.main()
效果图
flaskr 报错及其修改相关推荐
- mysql5.7 delimiter_percona MYSQL 5.7.13 5.7.14 MYSQLDUMP 导入报错delimiter (修改MYSQLDUMP代码)...
percona MYSQL 5.7.13 5.7.14 MYSQLDUMP 导入报错delimiter (修改MYSQLDUMP代码) 重庆八怪 2016-09-26 15:12:22 浏览1094 ...
- stm8s003 8K空间不够用,出现报错,修改stvd参数进行最优化
stm8s008空间大小是8K 使用的时候会出现空间不够用的情况,这个时候要对软件进行一些设置,从而优化程序大小. 1,修改优化等级,如下图所示,这样会优化掉无关的函数,将代码优化到最大程度 2,如果 ...
- VMWare 环境下devstack创建虚拟机报错及修改nova-api返回数据得条目
1.在生产环境中, 由于某个tenant下创建了有1300+条得security-group通过查询nova得数据库可以看出确实有1300+条得存在,但是通过curl调用的时候发现返回得数目只有100 ...
- mysql修改存储引擎报错_修改mysql存储引擎备份数据库报错及解决方案
备份数据库报错 原因:由于监控服务器最近cpu负载比较高.(cpu4核心,负载2.7左右)感觉很奇怪,因为别的服务器mysql占用的资源并不多,因此我首先优化了数据库的配置文件.cpu稍微下降了一点, ...
- RocketMQ_问题_启动报错,修改堆内存大小
启动broker报错 虚拟机内存小,导致虚拟机中的JVM内存小,进而在启动broker时分配JVM内存遇到问题 查看/usr/local/rocketmq-all-4.3.0/distribution ...
- kartoSLAM报错 transform_tolerance修改解决
文章目录 报错说明 报错逐个查找 [ WARN] [1577853090.145887813]: Costmap2DROS transform timeout. Current time: 15778 ...
- mysql报错3009_MySQL修改密码方法汇总
MySQL5.7版本之前修改密码的方法: 方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost ...
- mysql修改密码总是报错_mysql修改密码报错 | 吴老二
mysql已经安装好了,不过重置密码的时候使用update修改mysql的密码出现了报错,我的mysql是5.7版本的 mysql> use mysql Reading table inform ...
- vscode flake8报错E501, 修改settings.json无效
问题 vscode flake8报错E501, 根据网上的解决方案,修改settings.json,在其中添加代码加大检查长度或者忽略对应错误,具体代码如下: "python.linting ...
最新文章
- Shell 正则表达式总结及其含义举例
- java跟setattribute,java 中的request.setAttribute和session.setAttribute的区别
- CCF201909-4 推荐系统(100分)【模拟】
- Memory Networks
- matlab安装软件 Matlab视频教程李大勇 MATLAB程序开发入门课程 MATLAB神经网络30个案例分析及源程序
- 用MP3或WAV制作人声铃声的简单教程
- 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较
- SONY 系列手机 Android 5.1 系统 Root 方法
- Pytorch-早停法(early stopping)原理及其代码
- 6款免费的PDF解锁软件
- Diss GitHub被收购?说不定是件大喜事呢!
- 计算机管理可以全自动,这款全自动化的小工具,可以让你在父母面前光明正大得玩电脑啦...
- Windows Live Writer 代码插件改造
- 清明五一假期催热周边自驾游 迪庆州应势推出“杜鹃花之旅”
- Unity 利用Skybox Panoramic着色器制作全景图预览有条缝隙问题解决办法
- java中使用Jedis操作Redis实例
- 小程序真机调试代码包太大
- 搭建网校平台的具体方法
- 做网站的人必须遵守的N大定律
- 常见面试题的基础总结(JVM篇)