如何在HTML中调用外部Python文件实现问答功能(Django报错求助)
Django集成聊天Bot:从HTML输入到结果展示的完整解决方案
问题背景
需要通过HTML页面获取用户输入,调用Python聊天Bot处理输入后,将结果返回展示在页面上。现有代码包含命令行版本的聊天逻辑和Django模板,但无法在Django中正常运行。
解决方案步骤
一、重构聊天Bot代码(封装为可调用模块)
将原命令行代码改为可被Django视图调用的函数,移除命令行循环,初始化逻辑只执行一次。在你的Django应用目录下创建chatbot.py:
import nltk import numpy as np import random import string from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity from django.conf import settings import os # 仅首次运行时下载nltk依赖数据 try: nltk.data.find('tokenizers/punkt') nltk.data.find('corpora/wordnet') nltk.data.find('corpora/omw-1.4') except LookupError: nltk.download('punkt') nltk.download('wordnet') nltk.download('omw-1.4') # 使用项目根目录相对路径读取语料文件,避免硬编码 chatbot_file_path = os.path.join(settings.BASE_DIR, 'chatbot.txt') with open(chatbot_file_path, 'r', errors='ignore') as f: raw = f.read().lower() sent_tokens = nltk.sent_tokenize(raw) word_tokens = nltk.word_tokenize(raw) lemmer = nltk.stem.WordNetLemmatizer() def LemTokens(tokens): return [lemmer.lemmatize(token) for token in tokens] remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation) def LemNormalize(text): return LemTokens(nltk.word_tokenize(text.lower().translate(remove_punct_dict))) GREETING_INPUTS = ("hello", "hi", "greetings", "sup", "what's up", "hey") GREETING_RESPONSES = ["hi", "hey", "*nods*", "hi there", "hello", "I am glad! You are talking to me"] def greeting(sentence): for word in sentence.split(): if word.lower() in GREETING_INPUTS: return random.choice(GREETING_RESPONSES) def get_chatbot_response(user_response): user_response = user_response.lower().strip() if user_response == 'bye': return "Bye!" elif user_response in ['thanks', 'thank you']: return "You are welcome.." greet_reply = greeting(user_response) if greet_reply: return greet_reply # 生成核心回复 sent_tokens.append(user_response) TfidfVec = TfidfVectorizer(tokenizer=LemNormalize, stop_words='english') tfidf = TfidfVec.fit_transform(sent_tokens) vals = cosine_similarity(tfidf[-1], tfidf) idx = vals.argsort()[0][-2] flat = vals.flatten() flat.sort() req_tfidf = flat[-2] sent_tokens.remove(user_response) # 清理临时添加的用户输入 if req_tfidf == 0: return "I am sorry! I don't understand you" else: return sent_tokens[idx]
二、编写Django视图函数
在应用的views.py中添加处理请求的逻辑:
from django.shortcuts import render from .chatbot import get_chatbot_response def home(request): return render(request, 'home.html') def external(request): response_text = "" if request.method == 'POST': user_input = request.POST.get('askchat', '') if user_input: response_text = get_chatbot_response(user_input) return render(request, 'home.html', {'data_external': response_text})
三、配置Django路由
在项目根目录的urls.py中添加路由规则:
from django.contrib import admin from django.urls import path from your_app_name import views # 替换为你的应用名称 urlpatterns = [ path('admin/', admin.site.urls), path('', views.home, name='home'), path('external/', views.external, name='external'), ]
四、修正HTML模板
调整模板的结果展示逻辑,让回复更直观:
{% extends 'base.html' %} {% block title %}Home{% endblock %} {% block body %} <style> #body { padding-left:100px; padding-top:10px; } .response-box { margin-top: 20px; padding: 15px; background-color: #f8f9fa; border-radius: 8px; width: 750px; } </style> <div id="body"> <br> <marquee width="750px"> <h4>My name is ChatXBot. I'm your Child's Friend. Talk to me. If you want to exit, type Bye!</h4> </marquee> <br> <form action="/external" method="post"> {% csrf_token %} <textarea id="askchat" name="askchat" rows="10" cols="100" placeholder="Start Typing Here" required></textarea> <br><br> {% if data_external %} <div class="response-box"> <strong>ChatXBot:</strong> {{ data_external }} </div> {% endif %} <br> <input class="btn btn-secondary btn-lg" type="submit" value="Ask"> </form> </div> {% endblock %}
五、关键注意事项
- 将
chatbot.txt语料文件放在Django项目根目录下,或根据chatbot.py中的路径配置调整位置。 - 安装依赖包:在虚拟环境中执行
pip install nltk numpy scikit-learn。 - 生产环境中,建议提前下载好nltk数据,避免首次请求时的延迟。
内容的提问来源于stack exchange,提问作者Ayan
相关产品推荐
相关产品推荐

