zoukankan      html  css  js  c++  java
  • django restful 1-在线Python编辑器

    客户端(浏览器)----> 前端页面-----> 后端处理数据,并把数据以 json 形式发送到前端

     online_app.py

    from django.conf import settings
    from django.http import HttpResponse
    from django.conf.urls import url
    from django.views.decorators.http import require_POST # 目前的 API 视图只能用于接收 POST 请求
    from django.http import JsonResponse # 用于返回 JSON 数据
    import subprocess
    from django.views.decorators.csrf import csrf_exempt
    
    setting = {
        'DEBUG':True,
        'ROOT_URLCONF':__name__
    }
    
    settings.configure(**setting)
    
    # 主视图
    def home(request):
        # 浏览器与服务器的内容交互都是以二进制流的方式进行的,所以正规的响应就应返回字节串
        with open('index.html','rb') as f:
            html = f.read()
        return HttpResponse(html)
    
    # 执行客户端代码核心函数
    def run_code(code):
        try:
            output = subprocess.check_output(['python','-c',code],
                universal_newlines=True,
                stderr=subprocess.STDOUT,
                timeout=30)
        except subprocess.CalledProcessError as e:
            output = e.output
        except subprocess.TimeoutExpired as e:
            output = '
    '.join(['Time Out!!!',e.output])
            
        return output
    
    # API 请求视图
    @csrf_exempt
    @require_POST
    def api(request):
        code = request.POST.get('code')
        output = run_code(code)
        return JsonResponse(data={'output':output})
    
    # URL 配置
    urlpatterns = [url('^api/$',api,name='api'),
                   url('^$',home,name='home')]
    
    if __name__ == '__main__':
        import sys
        from django.core.management import execute_from_command_line
        execute_from_command_line(sys.argv)

    index.html

    <!DOCTYPE html>
    <html lang="zh-CN">
      <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>在线 Python 解释器</title>
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
        <style>
          #run {
              width: 20%; /*规定按钮的宽度*/
              margin-top: 10px; /*留出和输入框的间距*/
          }
          #code {
            font-size: 25px;
            resize: none;
          }
          #output {
            font-size: 25px;
            resize: none;
          }
        </style>
      </head>
      <body><!--在下面的注释中 bs 代表 bootstrap -->
      <div class="container"><!-- 页面的整体布局 -->
          <div class="row"> <!-- 这一行单独用来放标题 -->
            <div class="col-lg-12"> <!-- 根据 bs规定,所有内容应放在 col 中。这一列占满一行 -->
              <p class="text-center h1"> <!-- text-center 是 bs 中央排版类,h1 是 bs 一号标题类 -->
                在线 Python 解释器
              </p>
            </div>
          </div>
          <hr><!-- 标题和真正内容的分割线 -->
          <div class="row"><!-- 这一行用来放置主要内容 -->
            <div class="col-lg-6"><!-- 代码输入部分 -->
              <p class="text-center h3">
                在下面输入代码
              </p>
              <textarea id="code" placeholder="你的代码." class="form-control" ></textarea>
              <div class='text-right'><button id="run" type="button" class="btn btn-primary ">运行</button></div>
            </div>
            <div class="col-lg-6"><!-- 结果显示部分 -->
            <p class="text-center h3">运行结果</p>
            <div class="col-lg-12"><textarea id="output" disabled placeholder="输入代码并点击运行按钮" class="text-center form-control"></textarea></div>
            </div>
          </div>
      </div>
        <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
        <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
        <script>
          // 动态大小函数
          function changeSize(ele){
            $(ele).css({'height':'auto','overflow-y':'hidden'}).height(ele.scrollHeight)
          }
          // 应用到输入框
          $('#code').each(function(){
              this.oninput = function(){
                changeSize(this)
              }
            })
          function getCode(){
            return $('#code').val()
          }
          //打印结果到输出框并改变输出框大小
          function print(data){
             var ele = document.getElementById('output')
             output.value = data['output']
             changeSize(output)
           }
           // 点击按钮发送代码
           $('#run').click(function(){
            $.ajax({
              url:'/api/', //代码发送的地址
              type:'POST', // 请求类型
              data: {'code':getCode()},//调用代码获取函数,获得代码文本
              dataType: 'json', //期望获取的响应类型为 json
              success: print // 在请求成功之后调用 pprint 函数,将结果打印到输出框
            })
           }) 
        </script>
      </body>
    </html>

    结果:

  • 相关阅读:
    Web开发实用网站资源
    Web开发实用网站资源
    Ubuntu的LAMP与相关软件安装设置
    Ubuntu的LAMP与相关软件安装设置
    试除法求最小N个素数之二
    试除法求最小N个素数之二
    Python程序-输出1000以内素数
    Python程序-输出1000以内素数
    Ubuntu安装MPICH3集群计算环境
    Ubuntu安装MPICH3集群计算环境
  • 原文地址:https://www.cnblogs.com/Erick-L/p/8064680.html
Copyright © 2011-2022 走看看