Skip to content

Instantly share code, notes, and snippets.

@c1ay
Last active March 30, 2017 08:36
Show Gist options
  • Save c1ay/06554e6fc6e36803b40d2359ff1adbf1 to your computer and use it in GitHub Desktop.
Save c1ay/06554e6fc6e36803b40d2359ff1adbf1 to your computer and use it in GitHub Desktop.
tornado 基于函数分发url
from tornado.web import RequestHandler, HTTPError
from tornado.escape import json_encode, json_decode
class MethodDispatcher(RequestHandler):
allow_methods = ()
def set_default_headers(self):
origin = None
if self.request.headers.get('Origin'):
origin = self.request.headers['Origin']
else:
url = self.request.headers.get('Referer')
if url:
import re
pat = re.compile(r'(http|https)://.+/')
match = pat.search(url)
origin = match.group()[0:-1]
if origin:
self.set_header('Access-Control-Allow-Origin', origin)
self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
self.set_header('Access-Control-Max-Age', 1000)
self.set_header('Access-Control-Allow-Credentials', 'true')
def _delist_arguments(self, args):
for arg, value in args.items():
if len(value) == 1:
args[arg] = value[0]
return args
def _dispatcher(self):
args = None
if self.request.arguments:
args = self._delist_arguments(self.request.arguments)
path = self.request.uri.split('?')[0]
method = path.split('/')[-1]
if not method.startswith('_'):
if method not in self.allow_methods:
raise HTTPError(404)
func = getattr(self, method, None)
if func:
if args:
return func(**args)
else:
return func()
else:
raise HTTPError(404)
else:
raise HTTPError(404)
def get(self):
self.method = 'GET'
return self._dispatcher()
def post(self):
self.method = 'POST'
return self._dispatcher()
def options(self):
self.set_status(204)
self.finish()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment