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 = '\r\n'.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>

结果:

 

posted @ 2017-12-19 11:34  Erick-LONG  阅读(577)  评论(0编辑  收藏  举报