/
flask_app.py
154 lines (139 loc) · 4.24 KB
/
flask_app.py
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# -*- coding: utf-8 -*-
"""
Flaskapp for cloud foxbase
~~~~~~
"""
import json
import sys
from flask import Flask, request, redirect, url_for, abort, \
render_template
import logging
# create our little application :)
app = Flask(__name__)
from lex import lexer
from parse import parser
import fox_ast as ast
import err as myerr
import vistor
app.config.from_envvar('FLASKR_SETTINGS', silent=True)
def capture(f):
"""
Decorator to capture standard output
"""
def captured(*args, **kwargs):
from cStringIO import StringIO
# setup the environment
backup = sys.stdout
backup2 = sys.stderr
try:
sys.stdout = StringIO() # capture output
sys.stderr = StringIO()
f(*args, **kwargs)
out = sys.stdout.getvalue() # release output
err = sys.stderr.getvalue()
finally:
sys.stdout.close() # close the stream
sys.stderr.close()
sys.stdout = backup # restore original stdout
sys.stderr = backup2
return out,err # captured output wrapped in a string
return captured
@capture
def out(source):
try:
ast2 = parser.parse(lexer.lex(source))
vistor.exec_cmd_block(ast2)
del ast2
except myerr.ParserError as e:
print >>sys.stderr , e.message
except Exception ,e:
print >>sys.stderr, e
print logging.exception("The stack")
@app.route('/')
def index():
return render_template('index.html', hy_version="v0.1", server_software='cloud foxbase')
@app.route('/eval', methods = ["POST"])
def evals():
from fox_ast import data
v = getattr(data, "symbols", None)
if v is None:
setattr(data, "symbols", {
"global":dict(),
"local":dict()
})
input = request.get_json()
for i in input["env"]:
o,err = out(i)
o,err = out(input["code"])
return json.dumps({"stdout":o, "stderr":err})
@app.route('/test')
def test():
from fox_ast import data
v = getattr(data, "symbols", None)
if v is None:
setattr(data, "symbols", {
"global":dict(),
"local":dict()
})
source = open("a.prg", "r").read()
o,err = out(source)
o.replace('\n', "<br />")
return render_template("content.html", title="test", lines=[o])
@app.route('/testform/<file_name>', methods=['POST', 'GET'])
def testform(file_name):
print file_name
from err import AcceptError
if request.method == 'GET':
from fox_ast import data
v = getattr(data, "symbols", None)
if v is None:
setattr(data, "symbols", {
"global":dict(),
"local":dict()
})
data.symbols["global"]["method"] = "GET"
f = open(file_name+".prg", "r")
source = f.read()
f.close()
asks = dict()
try:
o,err = out(source)
#print "out:", o
if o.startswith("ACCEPT:"):
asks = eval(o[7:])
else:
lines =[o]
return render_template("content.html", title="testform", lines=[o])
except AcceptError,e:
pass
#print asks
return render_template("form.html", file_name=file_name, title="testform", asks=asks)
elif request.method == "POST":
#print 'here'
from fox_ast import data
v = getattr(data, "symbols", None)
if v is None:
print 'in here'
setattr(data, "symbols", {
"global":dict(),
"local":dict()
})
data.symbols["global"]["method"] = "POST"
#print 'hyere', request.form["fname"]
for i in request.form.items():
s = "%s=%s" %(i[0],i[1])
o,err = out(s)
f = open(file_name+".prg", "r")
o,err = out(f.read())
f.close()
o.replace('\n', "<br />")
return render_template("content.html", title="testform", lines=[o])
else:
return "zzzzzzz"
@app.route('/testform2/<file_name>', methods=['POST', 'GET'])
def show_user_profile(file_name):
# show the user profile for that user
return 'User %s' % file_name
if __name__ == '__main__':
app.run(threaded=True)
#app.run(debug=True)