0

我使用Flask,创建了我的第一个机器人TwilioDialogflow部署在 Heroku. 我的本地开发正在使用SQLite,但最终版本应该使用POSTGRES.

昨天,当我开始将数据存储到本地数据库时,当我尝试识别正在发送消息的用户时,我开始收到此错误。

这个想法是,在 db 创建用户后,我将存储他发送的每条消息和dialogflow. 但即使用户是在我的数据库中创建的,我也无法在user_id之后查询他。

由于这不是一个实际错误,但没有找到用户,我发布了下面的代码并打印了我试图用来调试的一些部分。

代码:

import os
from flask import Flask, request
from flask_sqlalchemy import SQLAlchemy
from twilio.twiml.messaging_response import MessagingResponse

from sportsbot.utils import fetch_reply

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///myDB.db' #path to database and its name
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False #supress warning of changes on database
db = SQLAlchemy(app)
#app.debug = True

from sportsbot.models import User, Team, Matches, Messages

@app.route('/')
def hello():
    return "hello world!"

@app.route('/whatsapp', methods=['POST'])
def sms_reply():
    "Check if user is new, create user at db if it is"
    phone_no = int(request.form.get('From').split(':')[1][1:])
    if User.query.filter(User.user_phone_no == phone_no).count() == 0:
        user = User(user_phone_no=phone_no)
        db.session.add(user)
        db.session.commit()
        print("New user")
    else:
        print("User already at base")

    #tring to debug
    print(phone_no)
    user_id = User.query.filter(User.user_phone_no == phone_no).first()
    print(user_id)

    msg = request.form.get('Body')
    reply = fetch_reply(msg,phone_no)
    
    
    "Reply to it"
    print(reply['text'])
    print(reply['intent'])
    resp = MessagingResponse()
    resp.message(reply['text'])

    #message = Messages(user_id = user_id, message= msg, response=reply['text'],intent=reply['intent'])
    #db.session.add(message)
    #try:
     #   db.session.commit()
    #except:
     #   db.session.rollback()

    return str(resp)

if __name__ == "__main__":
    app.run(debug=True)

用户等级:

class User(db.Model):
    user_id = db.Column(db.Integer, primary_key=True)
    user_name = db.Column(db.String(80), index = True, unique = False)
    user_phone_no = db.Column(db.Integer, index = True, unique = True)
    team_id = db.Column(db.Integer, db.ForeignKey('team.team_id'))

    def __repr__(self):
        return "{}".format(self.user_name)

印刷:

User already at base
5511990046548
None
Oi! Bem Vindo ao EsporteBot. Você gostaria de saber sobre algum time ou quer a agenda de eventos da semana?
Default Welcome Intent

知道我做错了什么,因为它在 db 看到用户但之后找不到它?

这段代码

User.query.filter(User.user_phone_no == phone_no).count()

找到 1 个用户

这段代码

user_id = User.query.filter(User.user_phone_no == phone_no).first()

给出None答案

4

1 回答 1

0

代码正常工作。

问题是,在User您创建自己的模型中__repr__(),它显示user_name但您没有添加user_name到数据库中,因此它使用Noneasuser_name并且当您运行时,first()它会__repr__()打印Noneuser_name- 这就是您进入None屏幕的原因。

当你使用

def __repr__(self):
    return "name: {}".format(self.user_name)

然后你得到name: None而不是None

也许更好用

def __repr__(self):
    return "id: {}, name: {}, phone no: {}".format(self.user_id, self.user_name, self.user_phone_no)

获取更多信息。

或者只是__repr__从你的模型中删除,然后你会看到类似的东西<User 1>


每个人都可以执行的最小工作示例:

import os
from flask import Flask, request, render_template_string
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///myDB.db' #path to database and its name
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False #supress warning of changes on database
db = SQLAlchemy(app)
db.create_all()

class User(db.Model):
    user_id = db.Column(db.Integer, primary_key=True)
    user_name = db.Column(db.String(80), index = True, unique = False)
    user_phone_no = db.Column(db.Integer, index = True, unique = True)
    
    def __repr__(self):
        #return "{}".format(self.user_name)
        #return "name: {}".format(self.user_name)
        return "id: {}, name: {}, phone no: {}".format(self.user_id, self.user_name, self.user_phone_no)

#db.create_all()

@app.route('/')
def hello():
    return render_template_string("""
<form method="POST" action="/whatsapp">
Phone <input name="From" value="James Bond:+007"></input>
<button type="submit">OK</button>
</form>
""")

@app.route('/whatsapp', methods=['POST'])
def sms_reply():
    "Check if user is new, create user at db if it is"

    parts = request.form.get('From').split(':')

    user_name = parts[0]
    phone_no = int(parts[1][1:])

    if User.query.filter(User.user_phone_no == phone_no).count() == 0:
        #user = User(user_phone_no=phone_no)
        user = User(user_phone_no=phone_no, user_name=user_name)
        db.session.add(user)
        db.session.commit()
        print("New user")
    else:
        print("User already at base")

    #tring to debug
    print('phone_no:', phone_no)
    user = User.query.filter(User.user_phone_no == phone_no).first()
    print('user:', user)

    return render_template_string("""{{user}}""", user=user)

if __name__ == "__main__":
    app.run(debug=True)
于 2020-08-24T14:50:14.353 回答