使用Django和JavaScript创建异步通信的应用程序

我会使用Python和Django来创建一个简单的Web应用程序。
同时,我将尝试满足以下要求,作为对异步通信的练习。

准备横幅和文本,当点击横幅时,简单的程序会替换文本和图像,而不需要重新加载屏幕。

想象一般的小说游戏就很容易理解。

最终的文件夹结构如下所示。

ajax_practice
├── myapp
│   ├── ...
├── db.sqlite3
├── manage.py
├── myproject
│   ├── ...
├── ajax
│   └── ...
├── static
│   └── css
│        └── style.css
│   └── images
│       ├── default_image.jpg
│       └── new_image.jpg
│   └── js
│        └── script.js
├── templates
│   └── index.html
└── requirements.txt

此外,由于这个简单的网络应用程序不使用数据库,我们不需要创建模型。

操作系统:苹果电脑的MacOS

在主目录下创建一个新的练习目录。

(没关系,可以用根目录)

% mkdir ajax_practice
% cd ajax_practice

创建虚拟环境

% python -m venv ajax

ajax 在这里是一个虚拟环境的名称,你可以自由指定任何名称。

激活虚拟环境

% source ajax/bin/activate

我已成功启动了虚拟环境。

(Ajax)只要变成 $,就可以了。

安装Django

在继续之前,请确保通过以下命令安装了最新版本的 pip。
pip是用于安装Django的软件。

% python -m pip install --upgrade pip

使用 requirements 文件安装软件包
requirements 文件是一个记录使用 pip install 命令安装依赖关系的列表的文件。

我要在 ajax_practice/ 文件夹中创建一个名为 requirements.txt 的文件。

% touch requirements.txt 

以下是目录。

ajax_practice
├── ajax
│   └── ...
└───requirements.txt

请将以下文本添加到requirements.txt文件中:

Django~=3.2.10

然后,执行以下命令以安装Django。

$ pip install -r requirements.txt

创建 Django 项目

$ django-admin startproject myproject .

我的项目是一个项目的名称,可以指定任何名称。

在命令的末尾输入一个句号”。”,这个句号表示将Django安装到当前工作目录中。

django-admin.py是一个用于创建所需目录和文件的脚本。

设定

我将对myproject/settings.py进行一些更改。

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

需要添加静态文件的路径。
在STATIC_URL下面添加STATIC_ROOT。

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

创建新的应用程序

% python manage.py startapp myapp

上述命令是用于在Django项目中创建一个新应用程序的命令。

当你创建了一个应用程序后,你需要告诉Django使用它,这可以在mysite/settings.py中进行设置。

找到“INSTALLED_APPS”,然后将其添加如下。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',  # 新しいアプリケーションを追加
]

Django项目的设置:

首先,您需要编辑Django项目中的settings.py文件,以设置模板目录。请将TEMPLATES部分中的DIRS部分按照以下方式进行编辑。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        ...
    },
]

创建模板

在项目的根目录下创建一个名为templates的文件夹。在里面创建一个名为index.html的文件。

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="/static/css/style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
    <p id="text">かつて、遥か彼方の宇宙に、ひとつの美しい星がありました。</p>
    <img id="image" src="/static/images/default_image.jpg">
    <div class="banner" id="banner"></div>
    <script src="/static/js/script.js"></script>
</body>
</html>

我們同時也準備了 CSS 檔案。

/* style.css */
.banner {
  position: fixed;
  bottom: 0;
  width: 100%;
  height: 20%; /* 画面の下半分を占めるように設定 */
  background-color: rgba(0,0,0,0.8); /* 背景色をより濃い黒色に設定 */
  cursor: pointer; /* カーソルを指アイコンにする */
}

#text {
  position: fixed;
  bottom: 0; /* バナーと同じ位置に配置 */
  color: white; /* テキストの色を白に設定 */
  z-index: 2; /* テキストを前面に表示 */
}

创建视图

在myapp/views.py文件中创建以下代码来创建视图。

※ 故事聽 ChatGPT 寫好。

from django.http import JsonResponse
from django.shortcuts import render

def change_text(request):
    if request.is_ajax():
        story = [
            "かつて、遥か彼方の宇宙に、ひとつの美しい星がありました。",
            "そこには、様々な生命が共存し、平和な時代が続いていました。",
            "しかし、ある日、暗黒の力が星を覆い始めました。",
            "暗黒の力は、星の生命たちを次々と闇へと変えていきました。",
            "星の生命たちが絶望する中、一筋の光が現れました。",
            "それは、星の守護神が遣わしたとされる、勇者の光でした。",
            "勇者は、星を救うため、一人で暗黒の力に立ち向かう決意をしました。",
            "長い戦いが続き、勇者は何度も傷つきながらも、決して諦めませんでした。",
            "そしてついに、勇者は暗黒の力を封じ、星に平和を取り戻しました。",
            "それ以降、星の生命たちは勇者を祝福し、平和な時代が再び訪れました。"
        ]
        new_image_url = "/static/images/new_image.jpg" if index == 5 else "/static/images/default_image.jpg"
        return JsonResponse({'story': story, 'new_image_url': new_image_url})

def index(request):
    return render(request, 'index.html')

设置URL:

我要在myproject/urls.py文件中添加URL设置。

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myapp.urls')),
]
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('change_text/', views.change_text, name='change_text'),
]

创建静态目录和放置静态文件。

将静态文件(例如图像文件)放置在项目的根目录下的static文件夹中。

首先,在 Django 项目的根目录下创建一个名为 static 的文件夹。

请将 default_image.jpg 文件(默认图像)和 new_image.jpg 文件(目标图像)放置在该目录中。

% mkdir static
% mkdir static/images
% touch static/images/default_image.jpg
% touch static/images/new_image.jpg

然后,每个图像文件都准备好了,可以是任何图像。

创建JavaScript文件

另外,在 static 目录下创建一个名为 js 的目录,并在其中创建一个 script.js 文件。

% mkdir static/js
% touch static/js/script.js

为了实现异步显示文本,将使用Ajax。

$(document).ready(function() {
  let index = 0;
  let intervalId = null;
  let typingSpeed = 40;
  let isTyping = false;
  let story = [
    {text: "かつて、遥か彼方の宇宙に、ひとつの美しい星がありました。", image: "/static/images/default_image.jpg"},
    {text: "そこには、様々な生命が共存し、平和な時代が続いていました。", image: "/static/images/default_image.jpg"},
    {text: "しかし、ある日、暗黒の力が星を覆い始めました。", image: "/static/images/dark_image.jpg"},
    {text: "暗黒の力は、星の生命たちを次々と闇へと変えていきました。", image: "/static/images/dark_image.jpg"},
    {text: "星の生命たちが絶望する中、一筋の光が現れました。", image: "/static/images/light_image.jpg"},
    {text: "それは、星の守護神が遣わしたとされる、勇者の光でした。", image: "/static/images/light_image.jpg"},
    {text: "勇者は、星を救うため、一人で暗黒の力に立ち向かう決意をしました。", image: "/static/images/hero_image.jpg"},
    {text: "長い戦いが続き、勇者は何度も傷つきながらも、決して諦めませんでした。", image: "/static/images/hero_image.jpg"},
    {text: "そしてついに、勇者は暗黒の力を封じ、星に平和を取り戻しました。", image: "/static/images/peace_image.jpg"},
    {text: "それ以降、星の生命たちは勇者を祝福し、平和な時代が再び訪れました。", image: "/static/images/peace_image.jpg"}
  ];

  function typeWriter(text, callback) {
    let i = 0;
    isTyping = true;
    intervalId = setInterval(function() {
      $("#text").append(text.charAt(i));
      i++;
      if (i === text.length) {
        clearInterval(intervalId);
        isTyping = false;
        typingSpeed = 40;
        callback();
      }
    }, typingSpeed);
  }

  function loadStory() {
    if (index === story.length) {
      return;
    }
    clearInterval(intervalId);
    $("#text").empty();
    typeWriter(story[index].text, function() {});
    $("#image").attr('src', story[index].image);
    index++;
  }

  $("#banner").click(function() {
    console.log("Banner clicked!");
    if (isTyping) {
      console.log("Typing... speeding up.");
      clearInterval(intervalId);
      typingSpeed /= 4;
      typeWriter(story[index - 1].text.slice($("#text").text().length), function() {});
    } else {
      console.log("Loading next story...");
      loadStory();
    }
  });

  loadStory();
});

如果保持这样的话会出现错误,因此在settings.py的开头添加以下内容。

import os  # 追加

from pathlib import Path

启动Web服务器

% python manage.py runserver

在浏览器中打开http://127.0.0.1:8000/。

通过使用Python和Django,我们成功完成了一个Web应用程序,当点击横幅时,可以异步更改文本和图像。

2b5d1e6273dec26b7a28f31e43bc6c1e.jpg
广告
将在 10 秒后关闭
bannerAds