Flask的Error汇总


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..newcls: 400 Bad Request: KeyError: 'region'

  • 类型错误:错误的请求,密钥错误。
  • 排错思路:首次加载页面时,没有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
上一篇:javascript – 如何在页面的“帖子”标题中切换帖子内容?


下一篇:RESTful API规范