我们先来看一下效果(简单的写了一个):
原理:将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