作者:hhh5460

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

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

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

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

其中flaskr.py2处报错:

  1. # flaskr.py
  2. # 所有的导入
  3. import sqlite3
  4. from flask import Flask, request, session, g, redirect, url_for, \
  5. abort, render_template, flash
  6. # 配置
  7. # DATABASE = '/tmp/flaskr.db' # 报错1: sqlite3.OperationalError: unable to open database file
  8. import os
  9. PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
  10. DATABASE = os.path.join(PROJECT_ROOT, 'tmp', 'flaskr.db') # 改正1:不把路径写死
  11. DEBUG = True
  12. SECRET_KEY = 'development key'
  13. USERNAME = 'admin'
  14. PASSWORD = 'default'
  15. # 创建我们的小程序
  16. app = Flask(__name__)
  17. app.config.from_object(__name__) # from_object() 将会寻找给定的对象(如果它是一个字符串,则会导入它),
  18. # 搜寻里面定义的全部大写的变量。
  19. def connect_db():
  20. return sqlite3.connect(app.config['DATABASE'])
  21. from contextlib import closing
  22. def init_db():
  23. with closing(connect_db()) as db:
  24. with app.open_resource('schema.sql') as f:
  25. #db.cursor().executescript(f.read()) # 报错2: ValueError: script argument must be unicode
  26. db.cursor().executescript(f.read().decode()) # 改正2:加了decode()
  27. db.commit()
  28. @app.before_request
  29. def before_request():
  30. g.db = connect_db()
  31. @app.teardown_request
  32. def teardown_request(exception):
  33. g.db.close()
  34. #四个视图函数:
  35. # 1.显示条目
  36. @app.route('/')
  37. def show_entries():
  38. cur = g.db.execute('select title, text from entries order by id desc')
  39. entries = [dict(title=row[0], text=row[1]) for row in cur.fetchall()]
  40. return render_template('show_entries.html', entries=entries)
  41. # 2.添加新条目
  42. @app.route('/add', methods=['POST'])
  43. def add_entry():
  44. if not session.get('logged_in'):
  45. abort(401)
  46. g.db.execute('insert into entries (title, text) values (?, ?)',
  47. [request.form['title'], request.form['text']])
  48. g.db.commit()
  49. flash('New entry was successfully posted')
  50. return redirect(url_for('show_entries'))
  51. # 3.登录
  52. @app.route('/login', methods=['GET', 'POST'])
  53. def login():
  54. error = None
  55. if request.method == 'POST':
  56. if request.form['username'] != app.config['USERNAME']:
  57. error = 'Invalid username'
  58. elif request.form['password'] != app.config['PASSWORD']:
  59. error = 'Invalid password'
  60. else:
  61. session['logged_in'] = True
  62. flash('You were logged in')
  63. return redirect(url_for('show_entries'))
  64. return render_template('login.html', error=error)
  65. # 4.注销
  66. @app.route('/logout')
  67. def logout():
  68. session.pop('logged_in', None)
  69. flash('You were logged out')
  70. return redirect(url_for('show_entries'))
  71. if __name__ == '__main__':
  72. app.run()

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

  1. import os
  2. import flaskr
  3. import unittest
  4. import tempfile
  5. class FlaskrTestCase(unittest.TestCase):
  6. def setUp(self):
  7. self.db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp()
  8. flaskr.app.config['TESTING'] = True
  9. self.app = flaskr.app.test_client()
  10. flaskr.init_db()
  11. def tearDown(self):
  12. os.close(self.db_fd)
  13. os.unlink(flaskr.app.config['DATABASE'])
  14. # 测试1:访问应用程序的根目录(/)
  15. def test_empty_db(self):
  16. rv = self.app.get('/')
  17. #assert 'No entries here so far' in rv.data # 报错3:TypeError: a bytes-like object is required, not 'str'
  18. assert b'No entries here so far' in rv.data # 改正3:文字修改为byte类型(或者rv.data修改为rv.data.decode()),以下都要同样修改!!
  19. def login(self, username, password):
  20. return self.app.post('/login', data=dict(username=username, password=password), follow_redirects=True)
  21. def logout(self):
  22. return self.app.get('/logout', follow_redirects=True)
  23. # 测试2:登录和注销
  24. def test_login_logout(self):
  25. rv = self.login('admin', 'default')
  26. assert b'You were logged in' in rv.data
  27. rv = self.logout()
  28. assert b'You were logged out' in rv.data
  29. rv = self.login('adminx', 'default')
  30. assert b'Invalid username' in rv.data
  31. rv = self.login('admin', 'defaultx')
  32. assert b'Invalid password' in rv.data
  33. # 测试3:添加新条目
  34. def test_messages(self):
  35. self.login('admin', 'default')
  36. rv = self.app.post('/add', data=dict(title='<Hello>', text='<strong>HTML</strong> allowed here'), follow_redirects=True)
  37. assert b'No entries here so far' not in rv.data
  38. assert b'&lt;Hello&gt;' in rv.data
  39. assert b'<strong>HTML</strong> allowed here' in rv.data
  40. if __name__ == '__main__':
  41. 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. python 实现int函数

    拖了这么久,最终还是战胜了懒惰,打开电脑写了这篇博客,内容也很简单,python实现字符串转整型的int方法 python已经实现了int方法,我们为什么还要再写一遍,直接用不就好了?事实确实如此,但 ...

  2. LeetCode 题解之Reverse Words in a String

    1.题目描述 2.问题分析 使用一个vector存储每个单词. 3.代码 void reverseWords(string &s) { vector<string> v; for ...

  3. Ionic 命令

    在WebStorm的设置中设置下面的命令后, 可以通过 工具 -->External Tools 中选中来执行指定脚本 C:\Windows\System32\WindowsPowerShell ...

  4. 新建maven工程使用webapp插件弹出javax.servlet.http.HttpServlet was not found on the Java Build Path异常

    检查pom.xml文件中是否引用javax.servlet,引用如下所示:

  5. 解决:Tomcat 局域网IP地址 访问不了

    解决:Tomcat 局域网IP地址 访问不了 2014年10月17日 ⁄ 综合 ⁄ 共 1000字 ⁄ 字号 小 中 大 ⁄ 评论关闭 如果连最基本的localhost:8080都失败的话. 原因就一 ...

  6. python基础学习15----异常处理

    异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件). 1.异常的类型 异常的类型多种多样,常见的异常有: AttributeE ...

  7. 进程控制编程——Linux编程

    1.进程的创建 编写一段程序,使用系统调用fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动.让每个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b” 和“c”. ...

  8. Coursera-AndrewNg(吴恩达)机器学习笔记——第四周编程作业(多分类与神经网络)

    多分类问题——识别手写体数字0-9 一.逻辑回归解决多分类问题 1.图片像素为20*20,X的属性数目为400,输出层神经元个数为10,分别代表1-10(把0映射为10). 通过以下代码先形式化展示数 ...

  9. dll动态链接库导出函数方法 -- 静态导出(__declspec前缀导出)

    简介 在之前已经笔者已经写过利用.def文件进行dll函数动态导出的文章,那么今天就给大家介绍一下,如何利用**__declspec**函数前缀进行简单的静态函数导出. 要点 大家阅读过动态导出的文章 ...

  10. MySQL基础之 日期时间函数

    基础日期函数和时间函数 1.CURDATE()函数:返回当前只带有年月日格式的日期 2.CURTIME()函数:返回当前只带有时分秒格式的时间 3.NOW()函数:返回当前日期和时间 4.UNIX_T ...