You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下Flask代码因crypt模块不支持报错的解决求助

解决Windows下Flask连接SQLite时的crypt模块导入错误

错误根源

你代码第一行导入的from crypt import methods是Unix系统专属的加密模块,Windows不支持该模块,且这个导入和Flask的请求方法(POST/GET)完全无关——Flask的请求方法判断靠request.method实现,根本不需要这个导入,这就是报错的核心原因。

代码调整点

  • 删除第一行错误的导入语句from crypt import methods
  • 修正Todo类的__repr__方法:你当前用了self.id但模型里没定义id字段,换成模型已有的主键字段Registration
  • 修正index函数创建Todo实例的代码:模型里没有content字段,对应你定义的name字段(需和表单输入字段匹配)
  • 将SQLALCHEMY_TRACK_MODIFICATIONS = False加入app.config配置,否则无法生效

修正后的完整代码

from distutils.log import debug
from flask import Flask, render_template, request, url_for, redirect
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///reg.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 正确配置消除警告
db = SQLAlchemy(app)

class Todo(db.Model):
    name = db.Column(db.String(200), nullable=False)
    Bdate = db.Column(db.Integer(), nullable=False)
    Gender = db.Column(db.String(6), nullable=False)
    Class = db.Column(db.String(9), nullable=False)
    Registration = db.Column(db.Integer(), primary_key=True)
    date_created = db.Column(db.DateTime, default=datetime.utcnow)

    def __repr__(self):
        return '<Task %r>' % self.Registration  # 替换为存在的主键字段

@app.route('/', methods=['POST','GET'])
def index():
    if request.method == "POST":
        task_content = request.form['card-body']
        # 这里需要根据表单实际提交的字段补充其他必填项,示例用默认值占位
        new_task = Todo(name=task_content, Bdate=0, Gender="", Class="")
        try:
            db.session.add(new_task)
            db.session.commit()
            return redirect('/')
        except Exception as e:
            return f"发生错误: {str(e)}"  # 显示具体错误便于调试
    else:
        tasks = Todo.query.order_by(Todo.date_created).all()
        return render_template('index.html', tasks=tasks)

if __name__ == "__main__":
    with app.app_context():
        db.create_all()  # 启动时自动创建数据库表
    app.run(debug=True)

额外提示

创建Todo实例时,示例里用了默认值填充必填字段,你需要根据前端表单实际提交的字段,从request.form中获取对应的值(比如request.form['Bdate'])。

内容的提问来源于stack exchange,提问作者Punda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:19:02