Flask应用报错TypeError: books()参数数量不符,求解决方法
错误原因与解决办法
错误含义
TypeError: books() takes 0 positional arguments but 11 were given 表示:你试图调用的books对象是一个不需要参数的函数(即/books路由的视图函数),但你传入了11个位置参数,导致参数不匹配触发报错。
核心问题
- 命名冲突:你定义的数据库模型类名为
books,同时又定义了同名的视图函数def books(),这会导致视图函数覆盖模型类的引用——当你在add视图里尝试实例化模型时,实际调用的是视图函数。 - (次要问题)SQLAlchemy模型默认构造函数需要关键字参数而非位置参数,即便没有命名冲突,直接传位置参数也可能引发问题。
- 表单提交的日期是字符串,无法直接存入模型的
Date类型字段;部分数字类型字段也需要从字符串转换为对应数值类型。 home_page视图上的@staticmethod装饰器无效,属于多余代码。
解决步骤
1. 修复命名冲突
将数据库模型类名改为Python规范的大驼峰命名(如Book),避免和视图函数重名:
class Book(db.Model): bookID = db.Column(db.Integer(), primary_key=True) title = db.Column(db.String()) authors = db.Column(db.String()) average_rating = db.Column(db.Float()) isbn = db.Column(db.Integer()) isbn13 = db.Column(db.Integer()) language_code = db.Column(db.String(length=10)) num_pages = db.Column(db.Integer()) ratings_count = db.Column(db.Integer()) text_reviews_count = db.Column(db.Integer()) publication_date = db.Column(db.Date()) publisher = db.Column(db.String())
2. 修正模型实例化代码
改用关键字参数实例化模型,并转换表单数据的类型:
# 先在文件顶部导入datetime模块 from datetime import datetime # 在add视图的else块中修改实例化代码 adds = Book( title=request.form['title'], authors=request.form['authors'], average_rating=float(request.form['average_rating']), isbn=int(request.form['isbn']), isbn13=int(request.form['isbn13']), language_code=request.form['language_code'], num_pages=int(request.form['num_pages']), ratings_count=int(request.form['ratings_count']), text_reviews_count=int(request.form['text_reviews_count']), publication_date=datetime.strptime(request.form['publication_date'], '%Y-%m-%d').date(), publisher=request.form['publisher'] )
3. 移除无效装饰器
删除home_page视图上的@staticmethod:
@app.route("/") def home_page(): return render_template('home.html')
4. 修复表单验证的重复判断
移除重复的average_rating检查:
if not request.form['title'] or not request.form['authors'] or not request.form['average_rating']or not request.form['isbn']or not request.form['isbn13']or not request.form['language_code']or not request.form['num_pages']or not request.form['ratings_count']or not request.form['text_reviews_count']or not request.form['publication_date']or not request.form['publisher']: flash('Please enter all the fields', 'error')
5. 调整代码缩进
确保add视图中return render_template与if语句同级,符合Python缩进规则:
@app.route('/add', methods = ['GET', 'POST']) def add(): if request.method == 'POST': # 表单验证与数据提交代码... return render_template('addbooks.html')
最终修正后的关键代码片段
from flask import Flask, request, flash, url_for, redirect, render_template from flask_sqlalchemy import SQLAlchemy from datetime import datetime app=Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///database.db" app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SECRET_KEY'] = "random string" db = SQLAlchemy(app) class Book(db.Model): bookID = db.Column(db.Integer(), primary_key=True) title = db.Column(db.String()) authors = db.Column(db.String()) average_rating = db.Column(db.Float()) isbn = db.Column(db.Integer()) isbn13 = db.Column(db.Integer()) language_code = db.Column(db.String(length=10)) num_pages = db.Column(db.Integer()) ratings_count = db.Column(db.Integer()) text_reviews_count = db.Column(db.Integer()) publication_date = db.Column(db.Date()) publisher = db.Column(db.String()) @app.route("/") def home_page(): return render_template('home.html') @app.route("/books") def books(): return render_template('books.html') @app.route("/members") def members(): return render_template('members.html') @app.route('/add', methods = ['GET', 'POST']) def add(): if request.method == 'POST': if not request.form['title'] or not request.form['authors'] or not request.form['average_rating']or not request.form['isbn']or not request.form['isbn13']or not request.form['language_code']or not request.form['num_pages']or not request.form['ratings_count']or not request.form['text_reviews_count']or not request.form['publication_date']or not request.form['publisher']: flash('Please enter all the fields', 'error') else: adds = Book( title=request.form['title'], authors=request.form['authors'], average_rating=float(request.form['average_rating']), isbn=int(request.form['isbn']), isbn13=int(request.form['isbn13']), language_code=request.form['language_code'], num_pages=int(request.form['num_pages']), ratings_count=int(request.form['ratings_count']), text_reviews_count=int(request.form['text_reviews_count']), publication_date=datetime.strptime(request.form['publication_date'], '%Y-%m-%d').date(), publisher=request.form['publisher'] ) db.session.add(adds) db.session.commit() flash('Record was successfully added') return render_template('addbooks.html') if __name__ == "__main__": app.run(debug=1)
内容的提问来源于stack exchange,提问作者Rajveer Mehta
相关产品推荐
相关产品推荐

