title: flask学习笔记
subtitle: 11. Flask_Error汇总
date: 2018-12-14 10:17:28
---
Flask的Error汇总
本文档主要记录了Flask1.0.3某项目运行在Windows10中遇到的一系列Error等。
1. redis.exceptions.ResponseError: Client sent AUTH, but no password is set
- 类型错误:配置错误
- 排错思路:本来已经在redis配置文件中设置了密码,但是仍然提示but no password is set,说明配置没有生效。然后就想到启动redis-server,可能没有指定到对应的配置文件中。 当然, 没有设置密码的,设置下密码就行。
- 解决方法:找到redis-server 指定的配置文件/usr/local/redis-5.0.5/redis.conf或/etc/redis/6379.conf(新增,已经设置了开机启动),然后指定到/etc/redis/6379.conf就行。
2. 'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '等error.
- 类型错误:配置错误
- 排错思路:该配合的基本都配置完成了,为什么还有相关error? 其实,调用代码是有序的,首先是指定数据库的链接地址,然后关闭数据库追踪(SQLALCHEMY_TRACK_MODIFICATIONS = False),她用于设置数据发生变更之后是否发送信号给应用,缺省为Ture。最后对数据库实例初始化。 创建一个SQLAlchemy实例,db对象来表示数据库。需要放在config后面,数据库在应用的表现形式是一个数据库实例,将会在应用实例化之后进行实例化和注册操作。
- 解决方法:
- 第一种示例:
- 指定使用的数据库的链接地址
- app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@127.0.0.1:3306/test8"
- 关闭追踪数据库的追踪特性
- app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
- 创建一个SQLAlchemy对象,需要放在config后面
- db = SQLAlchemy(app)
- 指定使用的数据库的链接地址
-
第二种示例:
# config.py SQLALCHEMY_DATABASE_URI = "postgresql://{DB_USER}:{DB_PASS}@{DB_ADDR}:{DB_POST}/{DB_NAME}".format(DB_USER=pg_db_username, DB_PASS=pg_db_password, DB_ADDR=pg_db_hostname, DB_POST=pg_db_post, DB_NAME=pg_db_name) SQLALCHEMY_TRACK_MODIFICATIONS = False # __init__.py db = SQLAlchemy()
- 第一种示例:
3. RecursionError: maximum recursion depth exceeded in comparison
- 类型错误:递归错误,这在Flask中,一般是表单模板写错了
- 排错思路:根据表单和视图去修改表单模板
- 解决方法:根据表单和视图去修改表单模板
4. jinja2.exceptions.TemplateNotFound jinja2.exceptions.TemplateNotFound: /index
- 类型错误:找不到模板
- 排错思路:针对我个人出现的问题是其他模板调用基本模板时,由于结构缺失爆发Error
-
解决方法:
{% extends "base.html" %} {% block content %} …… {% endblock %}
5. Method Not Allowed
- 类型错误:参数错误,The method is not allowed for the requested URL.请求的URL不允许使用该方法。
- 排错思路:视图功能缺失,没有逻辑来处理用户提交的数据。视图函数没有指定methods参数, 它告诉Flask这个视图函数接受GET和POST请求,并覆盖了默认的GET。
-
解决方法:
@app.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): flash('Login requested for user {}, remember_me={}'.format( form.username.data, form.remember_me.data)) return redirect('/index') return render_template('login.html', title='Sign In', form=form)
6. sqlalchemy.exc.InvalidRequestError: Table 'user' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object.
- 类型错误:无效请求
- 排错思路:已为此MetaData实例定义表'user'。 指定'extend_existing = True'以重新定义现有Table对象上的选项和列。
- 解决方法:在models.py删除多余创建user表的代码
7. AttributeError: 'NoneType' object has no attribute 'id'.
- 类型错误:属性错误,这是account下的注册函数出现的属性错误
- 排错思路:'空类型'对象没有属性'id'。主要是在对应位置,找到'None'。File位置:"E:\project\app\account\models.py", line 125, in modules。首先,打印。print('module', module)、print('modules', modules),发现,仍然是module None, modules [None, None];然后,继续找到对应的views.py,参看register,继续打印print(modules),发现[None, None],最后,找到对应的包含TYPE_REGISTERED的表,填入数据即可。
- 解决方法:
8. NameError: name 'posts' is not defined
- 类型错误:名称错误,name 'posts' is not defined
- 排错思路:名称'posts'未定义,变量posts没有定义,render_template()函数调用Flask框架原生依赖的Jinja2模板引擎。 Jinja2用render_template()函数传入的参数中的相应值替换{{...}}块。传入模板文件名和模板参数的变量列表,并返回模板中所有占位符都用实际变量值替换后的字符串结果。
-
解决方法:定义模板参数变量posts
@app.route('/') @app.route('/index') @login_required def index(): posts = [ { 'author': {'username': 'John'}, 'body': 'Beautiful day in Portland!' }, { 'author': {'username': 'Susan'}, 'body': 'The Avengers movie was so cool!' } ] return render_template('index.html', title='Home Page', posts=posts)
9. TypeError: render_template() takes 1 positional argument but 2 were given
- 类型错误:类型错误,name 'posts' is not defined
-
排错思路:render_template()占用1个位置参数,但给出了2个
return render_template('index.html', 'Home Page', posts=posts)
-
解决方法:重新定义模板位置参数变量posts
return render_template('index.html', title='Home Page', posts=posts)
10. werkzeug.exceptions.BadRequestKeyError
werkzeug.exceptions.HTTPException.wrap.
- 类型错误:错误的请求,密钥错误。
-
排错思路:首次加载页面时,没有request.args字典,这就是收到密钥错误的原因。
from flask import request as f_request @app.route('/') def ec2_procing(): region = f_request.args['region'] service = f_request.args['service']
-
解决方法:request.args该写为字典形式
region = f_request.args.get('region') service = f_request.args.get('service')
11. ValueError: urls must start with a leading slash
- 类型错误:值错误:网址必须以前导斜杠开头
-
排错思路:根据提示,进行修改
@app.route('go_back/<int:year>') def go_back(year): # return '<p>Welcome to %d!<p>' % (2018 - year) return '<p>Welcome to %d!<p>' % 2018
-
解决方法:request.args该写为字典形式
@app.route('/go_back/<int:year>') def go_back(year): # return '<p>Welcome to %d!<p>' % (2018 - year) return '<p>Welcome to %d!<p>' % 2018