Web实战:基于Django与Bootstrap的在线计算器

简介: Web实战:基于Django与Bootstrap的在线计算器


写在前面

本期内容:基于Django与Bootstrap的在线计算器

实验环境:

  • vscode
  • python(3.11.4)
  • django(4.2.7)
  • bootstrap(3.4.1)
  • jquery(3.7.1)

实验目标

项目功能主要是实现一个在线计算器。在输入框中输入计算式,单击“计算”按钮可以在输出框中输出结果。前端采用了 Bootstrap进行制作,提供输入框和按钮让用户进行信息输入,然后将计算式通过 Ajax方式传输给后台进行计算。后台采用Django 进行开发,获取到前端发送的数据后利用Python的子进程模块subprocess来计算式子,并将计算结果返回给前端进行显示。

实验内容

1. 创建项目

1.打开vscode命令行输入以下命令创建一个名为jsq的项目

django-admin startproject jsq

2.利用cd命令切换到manage.py文件所在目录,输入以下命令创建一个名为app的应用

cd jsq
python manage.py startapp app

3.输入以下命令启动项目

python manage.py runserver

4.在浏览器中输入“http://127.0.0.1:8000”检查web界面是否启动成功

出现如下界面说明web界面启动成功

2. 导入框架

1.在官网下载bootstrap源代码后解压

2.在app文件夹下创建一个static子文件夹

3.在解压的文件中找到dist文件夹,将该文件夹中的css,fonts,js三个子文件夹复制到static文件夹下面,并在static文件夹中新建一个名为img的子文件夹(用于存放图片)

4.进入jQuery官网,复制网页内容,保存为jquery.min.js文件放到static目录下的js子文件夹中。

3. 配置项目

前端代码

1.在app文件夹下创建一个templates子文件夹,然后在templates文件夹下面创建一个index.html文件,编辑该文件,填入以下代码:

{% load static %}
<!DOCTYPE html>
<html>
    <head>
        <meta charset = "utf-8">
        <meta http-equiv = "X-UA-Compatible" content = "IE=edge">
        <meta name = "viewport" content = "width=device-width,initial-scale=1">
        <title>在线计算器</title>
        <link rel = "stylesheet" href = "{% static 'css/bootstrap.min.css' %}"/>
        <link rel = "stylesheet" href = "{% static 'css/style.css'%}"/>
        <script src = "{% static 'js/jquery.min.js' %}"></script>
        <script src = "{% static 'js/bootstrap.min.js' %}"></script>
    </head>
    <body>
        <div class="container-fluid">
            <div class = "row">
                <div class = "col-xs-1 col-sm-4"></div>
                <div id = "computer" class="col-xs-10 col-sm-6">
                    <input type="text" id="txt_code" name="txt_code" value="" class="form-control input_show" placeholder="公式计算" disabled/>
                    <input type="text" id="txt_result" name="txt_result" value="" class="form-control input_show" placeholder="结果" disabled/>
                    <br />
                    <div>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_7()">7</button>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_8()">8</button>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_9()">9</button>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_div()">÷</button>
                        <br/>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_4()">4</button>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_5()">5</button>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_6()">6</button>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_mul()">×</button>
                        <br/>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_1()">1</button>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_2()">2</button>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_3()">3</button>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_sub()">-</button>
                        <br/>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_0()">0</button>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_00()">00</button>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_dot()">.</button>
                        <button type="button" class="btn btn-default btn_num" onclick="fun_add()">+</button>
                    </div>
                    <div>
                        <br/>
                        <button type = "button" class = "btn btn-success btn-lg btn_clear"
                        id = "lgbut_clear" onclick="fun_clear()">清空</button>
                        <button type = "button" class = "btn btn-success btn-lg"
                        id = "lgbut_compute">计算</button>
                    </div>
                </div>
                <div class="col-xs-1 col-sm-2"></div>
            </div>
        </div>
        <div class="extendContent"></div>
        <script>
            var x = document.getElementById("txt_code");
            var y = document.getElementById("txt_result");
            function fun_1(){
                x.value += '1';
            }
            function fun_2(){
                x.value += '2';
            }
            function fun_3(){
                x.value += '3';
            }
            function fun_4(){
                x.value += '4';
            }
            function fun_5(){
                x.value += '5';
            }
            function fun_6(){
                x.value += '6';
            }
            function fun_7(){
                x.value += '7';
            }
            function fun_8(){
                x.value += '8';
            }
            function fun_9(){
                x.value += '9';
            }
            function fun_add(){
                x.value += '+';
            }
            function fun_sub(){
                x.value += '-';
            }
            function fun_mul(){
                x.value += '*';
            }
            function fun_div(){
                x.value += '/';
            }
            function fun_0(){
                x.value += '0';
            }
            function fun_00(){
                x.value += '00';
            }
            function fun_dot(){
                x.value += '.';
            }
            function fun_clear(){
                x.value = '';
                y.value = '';
            }
        </script>
        <script>
            function ShowResult(data){
                var y = document.getElementById('txt_result')
                y.value = data['result']
            }
        </script>
        <script>
            $('#lgbut_compute').click(function(){
                $.ajax({
                    url:'/compute/',
                    type:'POST',
                    data:{
                        'code':$('#txt_code').val()
                    },
                    dataType:'json',
                    success:ShowResult
                })
            })
        </script>
    </body>
</html>

2.在css文件夹中创建一个style.css文件并填入以下内容:

body{
    background-image:url("../img/bg.jpg");
    background-position:center 0;
    background-repeat: no-repeat;
    background-attachment: fixed;
    background-size: cover;
    -webkit-background-size:cover;
    -o-background-size:cover;
    -moz-background-size:cover;
    -ms-background-size:cover;
}
.input_show{
    margin-top:35px;
    max-width:280px;
    height:35px;
}
.btn_num{
    margin:1px 1px 1px 1px;
    width:60px;
}
.btn_clear{
    margin-left:40px;
    margin-right:20px;
}
.extendContent{
    height:300px;
}

后端代码

1.配置视图处理函数,编辑views.py文件,填入以下代码:

from django.shortcuts import render
import subprocess
from django.views.decorators.http import require_POST
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import warnings
warnings.filterwarnings('ignore')
# Create your views here.
def home(request):
    return render(request, 'index.html')
def run_code(code):
    try:
        code = 'print(' + code + ')'
        output = subprocess.check_output(['python', '-c', code],
                                         universal_newlines=True,
                                         stderr=subprocess.STDOUT,
                                         timeout=30)
    except subprocess.CalledProcessError as e:
        output = '公式输入有误'
    return output
@csrf_exempt
@require_POST
def compute(request):
    code = request.POST.get('code')
    result = run_code(code)
    return JsonResponse(data={'result':result})

2.配置settings.py文件,找到INSTALLED_APPS字段,将创建的app应用添加进来,代码如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app', #在此处添加应用
]

找到ALLOWED_HOSTS字段并修改,编辑代码如下:

ALLOWED_HOSTS = ['*',]

3.配置访问路由,编辑urls.py文件,填入以下代码:

from django.contrib import admin
from django.urls import path
from app.views import home, compute
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home'),
    path('compute/', compute, name='compute'),
]

4. 运行项目

在终端切换到manage.py文件所在目录,输入以下命令运行项目,然后在浏览器中输入“http://127.0.0.1:8000”查看运行结果

python manage.py runserver

出现以下结果说明运行成功!

注意事项

若计算时遇到问题:

0.01s - Debugger warning: It seems that frozen modules are being used, which may0.00s - make the debugger miss breakpoints. Please pass-Xfrozen_modules=off0.00s - to python to disable frozen modules.0.00s - Note: Debugging will proceed. Set PYDEVD_DISABLE_FILE_VALIDATION=1 to disable this validation.

可以尝试在启动 Django 服务时添加 --noreload 参数来解决这个问题。如下所示:

python manage.py runserver --noreload

这个问题是由于 Django 的自动重载机制导致的,自动重载机制会导致 Python 解释器重新加载模块,从而导致调试器无法正确地识别断点位置。使用 --noreload 参数可以禁用自动重载机制,并避免这个问题的发生。

写在后面

我是一只有趣的兔子,感谢你的喜欢!

目录
相关文章
|
7月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
822 0
|
7月前
|
存储 JavaScript 安全
Web渗透-XSS漏洞深入及xss-labs靶场实战
XSS(跨站脚本攻击)是常见的Web安全漏洞,通过在网页中注入恶意脚本,窃取用户信息或执行非法操作。本文介绍其原理、分类(反射型、存储型、DOM型)、测试方法及xss-labs靶场实战案例,帮助理解与防御XSS攻击。
2272 1
Web渗透-XSS漏洞深入及xss-labs靶场实战
|
7月前
|
安全 Linux PHP
Web渗透-命令执行漏洞-及常见靶场检测实战
命令执行漏洞(RCE)指应用程序调用系统命令时,用户可控制输入参数,导致恶意命令被拼接执行,从而危害系统安全。常见于PHP的system、exec等函数。攻击者可通过命令连接符在目标系统上执行任意命令,造成数据泄露或服务瘫痪。漏洞成因包括代码层过滤不严、第三方组件缺陷等。可通过参数过滤、最小权限运行等方式防御。本文还介绍了绕过方式、靶场测试及复现过程。
1562 0
|
8月前
|
缓存 监控 中间件
Django中间件自定义开发指南:从原理到实战的深度解析
Django中间件是Web应用的“交通警察”,在请求与响应过程中进行全局处理,适用于身份验证、日志记录、性能监控等功能。本文详解中间件的工作原理、开发步骤及实战案例,帮助开发者掌握自定义中间件的构建方法,提升Django应用的可维护性与扩展性。
452 0
|
8月前
|
缓存 NoSQL 数据库
Django缓存机制详解:从配置到实战应用
本文全面解析Django缓存技术,涵盖配置方法与六大缓存后端,结合实战场景演示四种典型应用方式,帮助开发者提升Web应用性能,应对高并发挑战。
264 0
|
8月前
|
存储 缓存 数据库
Django模型开发全解析:字段、元数据与继承的实战指南
Django模型是业务逻辑与数据库的核心桥梁,本文详解模型开发三大核心:字段类型选择、元数据配置与继承模式应用,涵盖实战技巧与常见问题解决方案,助你构建高效可维护的数据模型。
249 0
|
9月前
|
缓存 NoSQL API
Django缓存机制详解:从配置到实战应用
本文介绍了 Django 缓存机制的基础知识与实战应用,涵盖缓存概念、Redis 安装配置、缓存策略及 API 使用,并通过 RBAC 权限系统演示缓存的读写与删除操作,助力提升 Web 应用性能。
236 0
|
9月前
|
缓存 JSON 应用服务中间件
Django实时通信实战:WebSocket与ASGI全解析(下)
本文将使用 Django Channels 构建一个多用户实时聊天室,并详细介绍如何在生产环境中部署 WebSocket 应用。
282 0
|
9月前
|
监控 NoSQL 网络协议
Django 实时通信实战:WebSocket 与 ASGI 全解析(上)
WebSocket 是一种全双工通信协议,支持实时数据传输,适用于聊天、协作、监控等场景。ASGI 是异步 Web 标准,配合 Uvicorn 服务器和 Django Channels,可实现 Django 的 WebSocket 功能,提升实时应用性能。
445 0
|
9月前
|
人工智能 开发工具 数据库
Django实战:Python代码规范指南
PEP 8 是 Python 官方代码风格指南,提升代码可读性与团队协作效率。本文详解命名规范、注释写法、常用工具(如 Black、flake8)、编程实践与代码优化技巧,助力写出规范、易维护的 Python 代码。
477 7