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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:10:28