/
tenjinserver.py
executable file
·97 lines (77 loc) · 2.95 KB
/
tenjinserver.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
#! /usr/bin/env python
#--
# Authors: Henrique Bastos, Vitor Mazzi
#
# This code is free to be used under the terms of the MIT license
# http://www.opensource.org/licenses/mit-license.php
#++
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import os, sys
import mimetypes
from urllib2 import urlparse
import tenjin
import tenjin.helpers
import tenjin.helpers.html
_helpers = dict(tenjin.helpers.__dict__)
_helpers.update(tenjin.helpers.html.__dict__)
class TenjinHandler(BaseHTTPRequestHandler):
def do_GET(self):
try:
scheme, netloc, path, params, query, fragment = urlparse.urlparse(self.path)
filename = "%s%s" % (os.getcwd(), path)
prefix = None
if path.endswith(".pyhtml"): #our dynamic content
query_dict = dict()
if query:
query_dict = dict([item.split('=') for item in query.split('&') if not item.isspace()])
template_name = filename.split('/')[-1]
try:
prefix = query_dict['prefix']
except KeyError:
pass
try:
context_name = query_dict['context']
context_module = __import__(context_name)
reload(context_module)
context = context_module.__dict__
except KeyError:
raise
_helpers = dict(tenjin.helpers.__dict__)
_helpers.update(tenjin.helpers.html.__dict__)
engine = tenjin.Engine(prefix=prefix, postfix='.pyhtml',
path=filename, cache=False, encoding='utf-8')
content = engine.render(template_name, context, _helpers).encode('utf-8')
content_type = 'text/html'
else:
content_type, content_encoding = mimetypes.guess_type(filename)
f = open(filename)
content = f.read()
f.close()
self.send_response(200)
self.send_header('Content-type', content_type)
self.end_headers()
self.wfile.write(content)
return
except IOError:
#raise
self.send_error(404,'File Not Found: %s' % path)
def main():
port = 8080
basedir = os.getcwd()
if len(sys.argv) == 3:
basedir, port = sys.argv[1:]
elif len(sys.argv) == 2:
basedir = sys.argv[1]
port = int(port)
os.chdir(basedir)
sys.path.append(os.getcwd())
try:
server = HTTPServer(('', port), TenjinHandler)
print 'started tenjinserver (port %d, docroot: %s)' % (port, basedir)
server.serve_forever()
except KeyboardInterrupt:
print '^C received, shutting down server'
server.socket.close()
if __name__ == '__main__':
print "WARNING !!!\n this potentially makes every file on your computer readable by the internet \n"
main()