[PythonWeb:Django框架]:前后端请求调用;

接着上篇

https://blog.youkuaiyun.com/Abraxs/article/details/138739727?spm=1001.2014.3001.5501
在这里插入图片描述

项目app包下面创建static包,引入jquery,bootstrap 相关js文件

在这里插入图片描述

views.py编写api

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
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})

这段Django的view.py文件内容包含两个函数:run_code和compute,用于处理用户提交的Python代码片段并执行它。以下是详细的分析:

run_code 函数
这个函数尝试将用户提供的code字符串包装在一个print()函数中,并使用subprocess模块在子进程中执行Python代码。如果执行成功,它将返回输出;如果执行失败(如语法错误),它将捕获subprocess.CalledProcessError异常并返回一个固定的错误消息“公式输入有误”。

存在的问题:

安全风险:直接执行用户提供的代码是极其危险的,因为它可能导致服务器被攻击者利用来执行恶意代码。
错误处理:错误消息“公式输入有误”可能不足以解释实际发生的错误,特别是当错误是由Python语法或其他非预期的问题引起时。
代码注入:如果用户提供的code包含特定的字符串(如引号),它可能会破坏print(’ + code + ')这个字符串的结构,导致语法错误或更糟糕的情况。
compute 函数
这个函数是一个Django视图,它接受POST请求,从请求中获取名为code的参数,调用run_code函数执行代码,并将结果作为JSON响应返回。

存在的问题:

CSRF保护:使用@csrf_exempt装饰器意味着这个视图不受CSRF保护。由于这个视图处理的是用户提交的代码,因此它应该受到CSRF保护,除非你有特定的理由不这样做。
权限验证:视图没有显示任何权限验证的逻辑,这意味着任何用户都可以提交代码并在服务器上执行它。
输入验证:没有对用户提供的code进行任何形式的验证或清理,这增加了安全风险。
安全建议
不要执行用户提供的代码:除非你完全理解并接受相关的安全风险,否则永远不要在生产环境中执行用户提供的代码。
使用安全的替代方案:考虑使用安全的沙箱环境(如Docker容器)或安全的代码执行库(如PyPy的sandboxing功能)来执行用户代码。
实现输入验证和清理:对用户提供的输入进行验证和清理,以防止代码注入和其他类型的攻击。
实施权限验证:确保只有授权的用户才能提交和执行代码。
启用CSRF保护:对于处理POST请求的Django视图,启用CSRF保护是一个好的安全措施。

compute文件夹下面的urls.py路由模块引入views.py刚刚定义的函数

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home'), # 首页路由
    
    path('compute/', compute, name='compute'),  # 添加针对公式计算compute的路由
]

html发送ajax请求

<script>
        $('#lgbut_compute').click(function () {
            $.ajax({
                url: '/compute/',
                type: 'POST',
                data: {
                    'code': $('#txt_code').val()
                },
                dataType: 'json',
                success: ShowResult
            })
        })
    </script>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值