【问题标题】:I can't deploy my chatbot on pyhtonanywhere, eventhough it works locally我无法在 pythonanywhere 上部署我的聊天机器人,即使它在本地工作
【发布时间】:2021-05-27 17:50:42
【问题描述】:

不知何故,我可以在本地使用我的聊天机器人(使用 Python、Flask、Chatterbot、Django),但无法在 Pythonanywhere 上部署它。我的 HTML 和我的聊天框都不会出现。我多次将第 35 行的 FLASK_PORT 更改为 443、8080、8000,但没有帮助。我的部署代码如下:

提前感谢您的回答!

#! /usr/bin/python3
# -*- coding: utf-8 -*-

## Import python libraries
import random
import csv
import os
import pytz
import logging

from flask import Flask, render_template, request, jsonify
from chatterbot import ChatBot
from chatterbot.response_selection import get_random_response
from chatterbot.trainers import ChatterBotCorpusTrainer

from pytz import timezone
from datetime import datetime
from dateTime import getTime, getDate
from time import localtime, strftime
from time import time


## Initialize Flask for webapp
app = Flask(__name__)
application = Flask(__name__)


## Application settings
logging.basicConfig(level=logging.DEBUG)
currentPath = os.path.dirname(os.path.abspath(__file__)) # Current absolute file path
logging.debug("Current path: " + currentPath)


## Flask settings
FLASK_PORT = 80 # use 8080 for local setup

## Chatbot settings
useGoogle = "no" # Yes - Bei nicht wissen durchsucht der Bot google nach dem unbekannten Begriff und gibt einen Link. No - Google wird nicht zur Hilfe gezogen
confidenceLevel = 0.90 # Bot confidence level - Muss zwischen 0 und 1 liegen. Je höher der Wert, desto sicherer muss sich der Bot seiner Antwort sein


## Initialize dateTime util
now = datetime.now(pytz.timezone("Europe/Berlin"))
mm = str(now.month)
dd = str(now.day)
yyyy = str(now.year)
hour = str(now.hour)
minute = str(now.minute)
if now.minute < 10:
    minute = '0' + str(now.minute)
chatBotDate = strftime("%d.%m.%Y, %H:%M", localtime())
chatBotTime = strftime("%H:%M", localtime())


## Initialize ChatterBot
bot = ChatBot(
    "ChatBot",
    logic_adapters=[
        {
            'import_path': 'chatterbot.logic.BestMatch'
        }
        ,{
            'import_path': 'chatterbot.logic.LowConfidenceAdapter',
            'threshold': confidenceLevel,
            'default_response': 'IDKresponse'
        }
    ],
    response_selection_method=get_random_response, #Art der Anwortauswahl -> random
    storage_adapter="chatterbot.storage.SQLStorageAdapter",
    database=currentPath + "/database/botData.sqlite3"
)

bot.read_only=True #Comment out um den Bot basierend auf Erfahrungen lernen zu lassen.
logging.info("Bot Learn Read Only:" + str(bot.read_only))

# Diesen Teil nach Deployment ausgrauen, um dauerhaftes Lernen zu vermeiden
bot.set_trainer(ChatterBotCorpusTrainer)
bot.train(
    "chatterbot.corpus.english.greetings",
    "chatterbot.corpus.english.conversations",
    currentPath + "/data/dialogues.yml"
)

# ACHTUNG: Auskommentieren (Hashtag entfernen) wenn ganze Datenbank gelöscht werden soll
#bot.storage.drop()

## Google fallback if response == IDKresponse
def tryGoogle(myQuery):
    return "<br><br>Gerne kannst du die Hilfe meines Freundes Google in Anspruch nehmen: <a target='_blank' href='https://www.google.com/search?q=" + myQuery + "'>" + myQuery + "</a>"


## CSV writer
def writeCsv(filePath, data):
    with open(filePath, "a", newline="") as logfile:
        csvWriter = csv.writer(logfile, delimiter = ";")
        csvWriter.writerow(data)


## Flask route for Herbie
@application.route("/", methods = ['GET'])
def home_eva():
    return render_template("index.html")


## Flask route for getting bot responses
@application.route("/getResponse", methods = ['GET'])
def get_bot_response():

    userText = str(request.args.get('msg'))
    botReply = str(bot.get_response(userText))

    if botReply == "IDKresponse":
        if useGoogle == "yes":
            botReply = botReply + tryGoogle(userText)
    elif botReply == "getTIME":
        botReply = getTime()
    elif botReply == "getDATE":
        botReply = getDate()

    writeCsv(currentPath + "/log/botLog.csv", [userText, botReply])

    data = {
        'botReply' : botReply
    }
    return jsonify(data)


## Flask route for posting evaluation results
@application.route("/result", methods = ['POST'])
def send_result():
    datetime = request.form.get("datetime")
    answer1 = request.form.get("answer1")
    answer2 = request.form.get("answer2")
    answer3 = request.form.get("answer3")
    answer4 = request.form.get("answer4")
    answer5 = request.form.get("answer5")
    answer6 = request.form.get("answer6")

    writeCsv(currentPath + "/log/evaluationResult.csv", [datetime, answer1, answer2, answer3, answer4, answer5, answer6])

    return jsonify({'success':True}, 200, {'ContentType':'application/json'})

## Flask route for posting evaluation results
@application.route("/resultAlternate", methods = ['POST'])
def send_result_alternate():
    bot = request.form.get("bot")
    datetime = request.form.get("datetime")
    answer1 = request.form.get("answer1")
    answer2 = request.form.get("answer2")
    answer3 = request.form.get("answer3")
    answer4 = request.form.get("answer4")
    answer5 = request.form.get("answer5")
    answer6 = request.form.get("answer6")

    writeCsv(currentPath + "/log/evaluationResultAlternate.csv", [bot, datetime, answer1, answer2, answer3, answer4, answer5, answer6])

    return jsonify({'success':True}, 200, {'ContentType':'application/json'})


## Flask route for posting feedback
@application.route("/feedback", methods = ['POST'])
def send_feedback():
    bot = request.form.get('bot')
    rating = request.form.get('rating')
    ux = request.form.get('ux')
    text = request.form.get('text')
    improvement = request.form.get('improve')

    writeCsv(currentPath + "/log/evaluationFeedback.csv", [bot, rating, ux, text, improvement])

    return jsonify({'success':True}, 200, {'ContentType':'application/json'})


## Flask route for posting email
@application.route("/email", methods = ['POST'])
def send_email():
    email = request.form.get("email")

    writeCsv(currentPath + "/log/evaluationEmail.csv", [email])

    return jsonify({'success':True}, 200, {'ContentType':'application/json'})


## Python Flask startup
if __name__ == "__main__":
    application.run(host='0.0.0.0', port=FLASK_PORT)

【问题讨论】:

  • 我不熟悉 PythonAnywhere,因为我以前使用过 Heroku,但请确保您托管的端口实际上在 PythonAnywhere 上是开放的。在 Heroku 中,您会在需要托管的环境变量中获得一个端口。
  • 感谢您的回答!不幸的是,我已经尝试了不同的端口,但仍然无法正常工作。
  • 你不要尝试“不同的端口”。您要么使用os.environ.get('PORT'),要么询问PythonAnywhere。检查这个pythonanywhere.com/forums/topic/4634

标签: python deployment chatbot pythonanywhere chatterbot


【解决方案1】:

在 PythonAnywhere 上,您不使用 app.run 来启动网站。相反,您可以在“Web”页面上对其进行配置,以便当您的域收到请求时,您的代码会自动启动并运行。 This help page有详细信息。

【讨论】:

    猜你喜欢
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    相关资源
    最近更新 更多