我们先来看一下效果(简单的写了一个):
原理:将post请求的代码数据写入了服务器的一个文件,然后用服务器的python编译器执行返回结果
实现代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#flaskrun.py # -*- coding: utf-8 -*- # __author__="ZJL" from flask import Flask from flask import request from flask import Response import json import zxby app = Flask(__name__) def Response_headers(content): resp = Response(content) resp.headers[ 'Access-Control-Allow-Origin' ] = '*' return resp @app .route( '/' ) def hello_world(): return Response_headers( 'hello world!!!' ) @app .route( '/run' , methods = [ 'POST' ]) def run(): if request.method = = 'POST' and request.form[ 'code' ]: code = request.form[ 'code' ] print (code) jsondata = zxby.main(code) return Response_headers( str (jsondata)) @app .errorhandler( 403 ) def page_not_found(error): content = json.dumps({ "error_code" : "403" }) resp = Response_headers(content) return resp @app .errorhandler( 404 ) def page_not_found(error): content = json.dumps({ "error_code" : "404" }) resp = Response_headers(content) return resp @app .errorhandler( 400 ) def page_not_found(error): content = json.dumps({ "error_code" : "400" }) resp = Response_headers(content) return resp @app .errorhandler( 405 ) def page_not_found(error): content = json.dumps({ "error_code" : "405" }) resp = Response_headers(content) return resp @app .errorhandler( 410 ) def page_not_found(error): content = json.dumps({ "error_code" : "410" }) resp = Response_headers(content) return resp @app .errorhandler( 500 ) def page_not_found(error): content = json.dumps({ "error_code" : "500" }) resp = Response_headers(content) return resp if __name__ = = '__main__' : app.run(debug = True ) |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#zxby.py # -*- coding: utf-8 -*- # __author__="ZJL" import os, sys, subprocess, tempfile, time # 创建临时文件夹,返回临时文件夹路径 TempFile = tempfile.mkdtemp(suffix = '_test' , prefix = 'python_' ) # 文件名 FileNum = int (time.time() * 1000 ) # python编译器位置 EXEC = sys.executable # 获取python版本 def get_version(): v = sys.version_info version = "python %s.%s" % (v.major, v.minor) return version # 获得py文件名 def get_pyname(): global FileNum return 'test_%d' % FileNum # 接收代码写入文件 def write_file(pyname, code): fpath = os.path.join(TempFile, '%s.py' % pyname) with open (fpath, 'w' , encoding = 'utf-8' ) as f: f.write(code) print ( 'file path: %s' % fpath) return fpath # 编码 def decode(s): try : return s.decode( 'utf-8' ) except UnicodeDecodeError: return s.decode( 'gbk' ) # 主执行函数 def main(code): r = dict () r[ "version" ] = get_version() pyname = get_pyname() fpath = write_file(pyname, code) try : # subprocess.check_output 是 父进程等待子进程完成,返回子进程向标准输出的输出结果 # stderr是标准输出的类型 outdata = decode(subprocess.check_output([EXEC, fpath], stderr = subprocess.STDOUT, timeout = 5 )) except subprocess.CalledProcessError as e: # e.output是错误信息标准输出 # 错误返回的数据 r[ "code" ] = 'Error' r[ "output" ] = decode(e.output) return r else : # 成功返回的数据 r[ 'output' ] = outdata r[ "code" ] = "Success" return r finally : # 删除文件(其实不用删除临时文件会自动删除) try : os.remove(fpath) except Exception as e: exit( 1 ) if __name__ = = '__main__' : code = "print(11);print(22)" print (main(code)) |
运行app.run()方法,通过post提交代码,就ok了。我们可以对输出结过做进一步的处理,我这只是为了解一下原理,就没继续了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/m0_37499059/article/details/79221990