- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlearning.py
More file actions
Latest commit
106 lines (91 loc) · 3.61 KB
/
Copy pathlearning.py
File metadata and controls
106 lines (91 loc) · 3.61 KB
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
r'''
learning.py
A Python 3 tutorial from http://www.liaoxuefeng.com
Usage:
python3 learning.py
'''
importsys
defcheck_version():
v=sys.version_info
ifv.major==3andv.minor>=4:
returnTrue
print('Your current python is %d.%d. Please use Python 3.4.'% (v.major, v.minor))
returnFalse
ifnotcheck_version():
exit(1)
importos, io, json, subprocess, tempfile
fromurllibimportparse
fromwsgiref.simple_serverimportmake_server
EXEC=sys.executable
PORT=39093
HOST='local.liaoxuefeng.com:%d'%PORT
TEMP=tempfile.mkdtemp(suffix='_py', prefix='learn_python_')
INDEX=0
defmain():
httpd=make_server('127.0.0.1', PORT, application)
print('Ready for Python code on port %d...'%PORT)
httpd.serve_forever()
defget_name():
globalINDEX
INDEX=INDEX+1
return'test_%d'%INDEX
defwrite_py(name, code):
fpath=os.path.join(TEMP, '%s.py'%name)
withopen(fpath, 'w', encoding='utf-8') asf:
f.write(code)
print('Code wrote to: %s'%fpath)
returnfpath
defdecode(s):
try:
returns.decode('utf-8')
exceptUnicodeDecodeError:
returns.decode('gbk')
defapplication(environ, start_response):
host=environ.get('HTTP_HOST')
method=environ.get('REQUEST_METHOD')
path=environ.get('PATH_INFO')
ifmethod=='GET'andpath=='/':
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<html><head><title>Learning Python</title></head><body><form method="post" action="/run"><textarea name="code" style="width:90%;height: 600px"></textarea><p><button type="submit">Run</button></p></form></body></html>']
ifmethod=='GET'andpath=='/env':
start_response('200 OK', [('Content-Type', 'text/html')])
L= [b'<html><head><title>ENV</title></head><body>']
fork, vinenviron.items():
p='<p>%s = %s'% (k, str(v))
L.append(p.encode('utf-8'))
L.append(b'</html>')
returnL
ifhost!=HOSTormethod!='POST'orpath!='/run'ornotenviron.get('CONTENT_TYPE', '').lower().startswith('application/x-www-form-urlencoded'):
start_response('400 Bad Request', [('Content-Type', 'application/json')])
return [b'{"error":"bad_request"}']
s=environ['wsgi.input'].read(int(environ['CONTENT_LENGTH']))
qs=parse.parse_qs(s.decode('utf-8'))
ifnot'code'inqs:
start_response('400 Bad Request', [('Content-Type', 'application/json')])
return [b'{"error":"invalid_params"}']
name=qs['name'][0] if'name'inqselseget_name()
code=qs['code'][0]
headers= [('Content-Type', 'application/json')]
origin=environ.get('HTTP_ORIGIN', '')
iforigin.find('.liaoxuefeng.com') ==-1:
start_response('400 Bad Request', [('Content-Type', 'application/json')])
return [b'{"error":"invalid_origin"}']
headers.append(('Access-Control-Allow-Origin', origin))
start_response('200 OK', headers)
r=dict()
try:
fpath=write_py(name, code)
print('Execute: %s %s'% (EXEC, fpath))
r['output'] =decode(subprocess.check_output([EXEC, fpath], stderr=subprocess.STDOUT, timeout=5))
exceptsubprocess.CalledProcessErrorase:
r=dict(error='Exception', output=decode(e.output))
exceptsubprocess.TimeoutExpiredase:
r=dict(error='Timeout', output='执行超时')
exceptsubprocess.CalledProcessErrorase:
r=dict(error='Error', output='执行错误')
print('Execute done.')
return [json.dumps(r).encode('utf-8')]
if__name__=='__main__':
main()