From cf52cd05b0c5cf017b400512553f8b6fa46e7e8e Mon Sep 17 00:00:00 2001 From: JingTao Chen Date: Sun, 1 May 2016 20:11:50 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=95=A6=E5=95=A6=E5=95=A6=E5=88=B7?= =?UTF-8?q?=E4=B8=AAcontribute?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jolla/HTTPerror.py | 69 ++++++++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/jolla/HTTPerror.py b/jolla/HTTPerror.py index f652d95..6c6fb7e 100644 --- a/jolla/HTTPerror.py +++ b/jolla/HTTPerror.py @@ -1,5 +1,39 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +import re + +HTTP_err_codes = { + "200":"OK", + "400":"Bad Request", + "401":"Unauthorized", + "402":"Payment Required", + "403":"Forbidden", + "404":"Not Found", + "405":"Method Not Allowed", + "406":"Not Acceptable", + "407":"Proxy Authentication Required", + "408":"Request Timeout", + "409":"Conflict", + "410":"Gone", + "411":"Length Required", + "412":"Precondition Failed ", + "413":"Payload Too Large ", + "414":"URI Too Long ", + "415":"Unsupported Media Type", + "416":"Range Not Satisfiable ", + "417":"Expectation Failed", + "418":"I'm a teapot ", + "421":"Misdirected Request ", + "422":"Unprocessable Entity ", + "423":"Locked ", + "424":"Failed Dependency ", + "426":"Upgrade Required", + "428":"Precondition Required ", + "429":"Too Many Requests", + "431":"Request Header Fields Too Large", + "451":"Unavailable For Legal Reasons" +} + class HTTPError(Exception): @@ -7,33 +41,22 @@ class HTTPError(Exception): def __init__(self, info=None): self.info = info + self.error_code = 200 if self.info: print '<' + self.info + '>' - - -class HTTP404Error(HTTPError): - error_code = 404 - - def __str__(self): - return "404 NOT FOUND" - - -class HTTP502Error(HTTPError): - error_code = 502 - + def __str__(self): - return "502 SERVER ERROR" - + return "%s %s"%(self.error_code, HTTP_err_codes[self.error_code]) -class HTTP403Error(HTTPError): - error_code = 403 - - def __str__(self): - return "403 FORBBIDEN" +def __ini__(self, error_code=200, info=None, disp_err = ""): + self.error_code = re.findall("(?<=HTTP)\d+", self.__class__.__name__)[0] + self.info = info -class HTTP500Error(HTTPError): - error_code = 500 +if __name__ != '__main__': + import copy + for k, v in HTTP_err_codes.items(): + New_name = "HTTP%sError"%k + New_code = int(k) + globals()[New_name] = type(New_name, (HTTPError, ), {"__init__":__ini__}) - def __str__(self): - return "server error" From e5f87849f7faeb83fa6b6f0c1862605333584080 Mon Sep 17 00:00:00 2001 From: JingTao Chen Date: Thu, 5 May 2016 13:17:11 +0800 Subject: [PATCH 2/2] add debugger --- README.md | 26 +++- example/ajax_calculater.py | 19 +++ example/app.py | 14 +- example/cal/index.html | 34 +++++ example/templates/index.html | 10 +- jolla/HTTPerror.py | 69 ++++------ jolla/HTTPerror.pyc | Bin 0 -> 2258 bytes jolla/__init__.pyc | Bin 0 -> 299 bytes jolla/plugins.py | 42 ++++-- jolla/plugins.pyc | Bin 0 -> 1941 bytes jolla/server.py | 239 ++++++++++++++++++++++------------- jolla/server.pyc | Bin 0 -> 8606 bytes jolla/session.py | 16 +++ jolla/session.pyc | Bin 0 -> 2928 bytes setup.py | 5 +- 15 files changed, 313 insertions(+), 161 deletions(-) create mode 100644 example/ajax_calculater.py create mode 100644 example/cal/index.html create mode 100644 jolla/HTTPerror.pyc create mode 100644 jolla/__init__.pyc create mode 100644 jolla/plugins.pyc create mode 100644 jolla/server.pyc create mode 100644 jolla/session.pyc diff --git a/README.md b/README.md index a243c17..53b29d7 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,15 @@ jolla is a pure API server framework,and it is based on the gevent. > still being constrating -##Install +version:1.1.0 +- basic work have done,it's already a api server for api collect. +- delete the statics function,if you wanna css or js,use cdn or server like nginx and apache httpd; - sudo pip install jolla +## INSTALL + +``` +sudo pip install jolla +``` ## QUICKSTART add a `app.py`,and write dowm: @@ -21,6 +27,14 @@ session = session() def index(request): return plugins.render('index.html') +def chinese(request): + try: + if request['data']['ww']=='海贼王': + return 'great anime' + except: + pass + return 'yeah!chinese' + def data(request): data = {'data': request['id']} @@ -29,6 +43,7 @@ def data(request): def add(request): session.add_value('qq', 'ww') + return 'yes' @@ -56,12 +71,9 @@ class app(server.WebApp): (r'/data', data), (r'/add', add), (r'/get', get), - (r'/blog', blog) + (r'/blog', blog), + (r'/chinese',chinese) ] - -if __name__ == '__main__': - server = server.jolla_server(app) - server.run_server() ``` and then,run: diff --git a/example/ajax_calculater.py b/example/ajax_calculater.py new file mode 100644 index 0000000..1f71115 --- /dev/null +++ b/example/ajax_calculater.py @@ -0,0 +1,19 @@ +from jolla import WebApp,jolla_server,render_json,render + +def index(request): + return render('index.html') + +def add(request): + return render_json({'answer':int(request['data']['a'])+int(request['data']['b'])}) + +class app(WebApp): + urls = [ + (r'/', index), + (r'/add', add) + ] + + templates='cal' + +if __name__ == '__main__': + server = jolla_server(app) + server.run_server() diff --git a/example/app.py b/example/app.py index 1f01df0..ca8fd23 100644 --- a/example/app.py +++ b/example/app.py @@ -15,6 +15,15 @@ def index(request): return plugins.render('index.html') +def chinese(request): + try: + if request['data']['ww'] == '海贼王': + return 'great anime' + except: + pass + return 'yeah!' + + def data(request): data = {'data': request['id']} return plugins.render_json(data) @@ -50,9 +59,10 @@ class app(server.WebApp): (r'/data', data), (r'/add', add), (r'/get', get), - (r'/blog', blog) + (r'/blog', blog), + (r'/chinese', chinese) ] if __name__ == '__main__': server = server.jolla_server(app) - server.run_server() + server.run_server(reload = True) diff --git a/example/cal/index.html b/example/cal/index.html new file mode 100644 index 0000000..7574949 --- /dev/null +++ b/example/cal/index.html @@ -0,0 +1,34 @@ + + + + +

two numbers

+
+ a: + +
b: + +
+

result:

+ +
+ + + + + + diff --git a/example/templates/index.html b/example/templates/index.html index 6905073..e3bff62 100644 --- a/example/templates/index.html +++ b/example/templates/index.html @@ -1,11 +1,11 @@ + - - index - + + -

hello world!

- +

hello world!我是汉字

+ diff --git a/jolla/HTTPerror.py b/jolla/HTTPerror.py index 6c6fb7e..8ec8ad8 100644 --- a/jolla/HTTPerror.py +++ b/jolla/HTTPerror.py @@ -1,39 +1,5 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import re - -HTTP_err_codes = { - "200":"OK", - "400":"Bad Request", - "401":"Unauthorized", - "402":"Payment Required", - "403":"Forbidden", - "404":"Not Found", - "405":"Method Not Allowed", - "406":"Not Acceptable", - "407":"Proxy Authentication Required", - "408":"Request Timeout", - "409":"Conflict", - "410":"Gone", - "411":"Length Required", - "412":"Precondition Failed ", - "413":"Payload Too Large ", - "414":"URI Too Long ", - "415":"Unsupported Media Type", - "416":"Range Not Satisfiable ", - "417":"Expectation Failed", - "418":"I'm a teapot ", - "421":"Misdirected Request ", - "422":"Unprocessable Entity ", - "423":"Locked ", - "424":"Failed Dependency ", - "426":"Upgrade Required", - "428":"Precondition Required ", - "429":"Too Many Requests", - "431":"Request Header Fields Too Large", - "451":"Unavailable For Legal Reasons" -} - class HTTPError(Exception): @@ -41,22 +7,33 @@ class HTTPError(Exception): def __init__(self, info=None): self.info = info - self.error_code = 200 if self.info: print '<' + self.info + '>' - + + +class HTTP404Error(HTTPError): + error_code = 404 + + def __str__(self): + return "<404 NOT FOUND>" + + +class HTTP502Error(HTTPError): + error_code = 502 + def __str__(self): - return "%s %s"%(self.error_code, HTTP_err_codes[self.error_code]) + return "<502 SERVER ERROR>" + -def __ini__(self, error_code=200, info=None, disp_err = ""): - self.error_code = re.findall("(?<=HTTP)\d+", self.__class__.__name__)[0] - self.info = info +class HTTP403Error(HTTPError): + error_code = 403 + + def __str__(self): + return "<403 FORBBIDEN>" -if __name__ != '__main__': - import copy - for k, v in HTTP_err_codes.items(): - New_name = "HTTP%sError"%k - New_code = int(k) - globals()[New_name] = type(New_name, (HTTPError, ), {"__init__":__ini__}) +class HTTP500Error(HTTPError): + error_code = 500 + def __str__(self): + return "" diff --git a/jolla/HTTPerror.pyc b/jolla/HTTPerror.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5c875c6d8c8af6752ddc7c5b7c1f062a7f0b37e GIT binary patch literal 2258 zcmc&#&x_MQ6n^RNR##DQDSCU{mn``)BY757j|Z4>6@&Ew5{?|tuOCjVorR{d%|_hI_v@p~VKOi%;>0$^xB zV8AKBJAfAlILU!9v^Aeua}X3})?#MOLr|Jo%bB$RL1kvGX4WDEHRzk?5LQ)D><Pu6c`tUV!#1{paO7;dI4D9BtM_TY&@VvcTk)da00+l0XPImZqd?I zuVYsANBfaZx^EHpeL}A{Z^4N2|4!h0JhoAOK0|C8Ly6 z=TV`oTFutq^(01hJ?p4U>xosxR?^*ug`E~N{D`hTxzC2KC?TM0T5wlh#Ho!S4YxOF zJnTJnyX`bfTExhCp7hG{Rb||lbEy)}FQF=_=fE%tj#0H3IWTHyMy)*$Va2>t?JwZ? zm-oHq&a%A!T7>t@h-xE9qwlb14r@4!_1GGy*L+^3lsCmWb@r7rId3(0m*xD!BAicq zeHZ(jbvlo`j=L_xZ)}qAEd;-QCgFR{=CXwUT!e7?wQMPpHzH{WI-b|X_w7ycO&v3dQI9>(|>>Ja}u>`Jf^~5b&&q(ZbFYQW|Ga%4U4Q6WVh* Rc)hW3_4kovO!7KQ=NG`@Mh^f0 literal 0 HcmV?d00001 diff --git a/jolla/plugins.py b/jolla/plugins.py index 5723e4f..b057826 100644 --- a/jolla/plugins.py +++ b/jolla/plugins.py @@ -4,24 +4,48 @@ import json import os +from HTTPerror import HTTP404Error +from server import static_setting def render(filename): - with open(os.path.abspath('templates/' + filename), "r") as f: - res = f.read() + if static_setting['templates'][-1] != '/': + static_setting['templates'] = static_setting['templates'] + '/' - return (res, ('Content-Type', 'text/html')) + try: + with open(os.path.abspath(static_setting['templates'] + filename), "r") as f: + res = f.read() + return (res, ('Content-Type', 'text/html')) -def render_json(data): + except IOError: + print "" + raise HTTP404Error + + +def render_json(data,indent=0): if isinstance(data, dict): - return (json.dumps(data), ('Content-Type', 'application/json')) + return (json.dumps(data,ensure_ascii=False,indent=indent), ('Content-Type', 'application/json')) else: + print "" raise AttributeError def render_media(filename): - with open(os.path.abspath('statics/' + filename), "r") as f: - res = f.read() - - return res + if static_setting['statics'][-1] != '/': + static_setting['statics'] = static_setting['statics'] + '/' + + try: + with open(os.path.abspath(static_setting['statics'] + filename), "r") as f: + res = f.read() + + if 'css' in filename[-4:]: + content = ('Content-Type', 'text/css') + elif 'js' in filename[-4:]: + content = ('Content-Type', 'application/javascript') + else: + raise HTTP404Error + return (res, content) + + except IOError: + raise HTTP404Error diff --git a/jolla/plugins.pyc b/jolla/plugins.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1de1093e09bbc6acb9fe52f1cb8380371060140 GIT binary patch literal 1941 zcmb_dO>Z1U5UrlsU3;B%VkIFa2;>!qXgDOpAx9@7v0@wvZD4HV$QP?U(~f&RUz+ZX zV#&@S&M{FW4%|3^_#s^QD@dHVBEhSg#TW$xLSF6Ec2|E)y?XU(!(Zm-`rk*JDNR2C zem}wEwqP=R73D;jOvj40l#Bz)11dt=3Q6%=NO^~fE^T!&@6bye>QUCEtVb_#Xoj*G zanACU>(MN(x4+>tiWG)^0JFBS@%inKZ$D_7s%gC!;dNenn{GSfy)B=lygS6x#k0c8 zU%_|@^m-Q1bp)~>QuEP?FQmnGdATGySS7E>2Q&_8-1%eAA<^P7V0Gv?pf^|ONYSC9 zahHyXjsn^QzAqjh29(XxZb0js<@?m}J=&k6<~1p$0PWK?KSM7Rm5Lr?`+C$zSR>EY zo1)IOH%{>4^+d7Q#xd%Zs`RGxH#ZJy)GEJ7vYD*xceBzdsSiLQkVPMrd7sdX&?Xe?W>=^`7Rz;d9H63+IiE&=9xxHOzVv6 zeDcJW?pA$(obttGW||8axyvx5uBvx}P~A|MgNwnu>MG0Llo9d6N2Ct!U;v`QC87k6 z&8;cV@Sx;?9pwR9k5z!0WFAqSpsmZa31ys=kyN57-J~(w+NIV?P!=(j{_Vss;E1m4 z+ybht%6ROm(k;Td?Dxzt(_RmYiSxr9Ol<1U;_vUSi5QumgRu_j@w!Zn5XcwFfM162 z0dG>&PDZObhfug~?s?zXoryQCoH$kOX~dN9`_7*|=B#CJn?rjKQ^(aq>XKRtx=OUm z)pnxYA2Ipw+I{}NwF{=X3VO7(-=pS;vI}$+Qn^G~|MbGwlnrE|M_?Ug0nHzVQ_U|z z^E0CPA6WD4h7-BZ1Ib7f)b^`Z>)5$#@cpH> z^ivdMV{3m#7dU;%8C(A0PChMNBVl?HuD*m7k;no!CTR)@S7gMH66QPM7M3u20iU+b zEW-SJI|ILFT3dz5to{&l#}#(EKP;%e!V~lqcM562$rWr7Fw%?pFUIiyi(nCHJJUQh rO^cj`lf2931DHQi$mqP99OrYnsIp0J?sBT78U|{B&=" + + def __str__(self): + if(self.info == 'too many re'): + return "" + if(self.info == 'route error'): + return '' + if(self.info == 'query already in request'): + return "" + + +class RequestError(Exception): + + def __init__(self): + pass + + +class RequestValueError(RequestError): + + def __str__(self): + return "" class WebApp(): @@ -28,87 +49,101 @@ class WebApp(): _parsed_urls = [] - setting = { - 'statics': r'/statics', - 'templates': r'/templates' - } - - def __init__(self, environ): - - self._environ = environ + global static_setting - self._path = self._environ['PATH_INFO'] - if self._path[-1] != '/': - self._path = self._path + '/' + templates = False + def __init__(self, environ=None, get_urls=True): self.request = {} - try: - self.request['cookies'] = self._environ['HTTP_COOKIE'] - except KeyError: - self.request['cookies'] = None + if environ: + self._environ = environ + + self._path = self._environ['PATH_INFO'] + if self._path[-1] != '/': + self._path = self._path + '/' + + try: + self.request['cookies'] = self._environ['HTTP_COOKIE'] + except KeyError: + self.request['cookies'] = None + + self.request['http_protocol'] = self._environ['SERVER_PROTOCOL'] + + self.request['user_agent'] = self._environ['HTTP_USER_AGENT'] + + try: + self.request['http_connect'] = self._environ['HTTP_CONNECTION'] + except KeyError: + self.request['http_connect'] = None + + self.request['http_port'] = self._environ['HTTP_HOST'] + + self.request['method'] = self._environ['REQUEST_METHOD'] + + try: + self.request['content_length'] = self._environ[ + 'CONTENT_LENGTH'] + self.request['content_type'] = self._environ['CONTENT_TYPE'] + self.request['http_accept_encoding'] = self._environ[ + 'HTTP_ACCEPT_ENCODING'] + except KeyError: + self.request['content_length'] = None + self.request['content_type'] = None + self.request['http_accept_encoding'] = None + + self.request['data'] = {} + self.request['query_string'] = {} + # Beyond Comp + line = self._environ['QUERY_STRING'] + request_data = environ['wsgi.input'].read(environ.get('content_length', 0)) + if request_data: + request_data = unquote(request_data) + for data_pair in request_data.split('&'): + key, value = data_pair.split('=') - self.request['http_protocol'] = self._environ['SERVER_PROTOCOL'] + self.request['data'][key] = value + # up + query_string = self._environ['QUERY_STRING'] + if query_string: + query_string = unquote(query_string) + for data_pair in query_string.split('&'): + try: + key, value = data_pair.split('=') + self.request['data'][key] = value + self.request['query_string'][key] = value + except ValueError: + pass + # Below Comp + if not get_urls: + for url in self.urls: + try: + res = self.url_parse(url[0]) + except RouteError: + print "" + raise HTTP404Error - self.request['user_agent'] = self._environ['HTTP_USER_AGENT'] + if isinstance(res, tuple): + self._parsed_urls.append((res[0] + '$', url[1], res[1])) + else: + self._parsed_urls.append((res + '$', url[1])) - self.request['http_connect'] = self._environ['HTTP_CONNECTION'] + if self.templates: + static_setting['templates'] = self.templates - self.request['http_port'] = self._environ['HTTP_HOST'] + def __repr__(self): + return "Jolla.WebAppObject" - self.request['method'] = self._environ['REQUEST_METHOD'] + def __str__(self): + return "" - try: - self.request['content_length'] = self._environ['CONTENT_LENGTH'] - self.request['content_type'] = self._environ['CONTENT_TYPE'] - except KeyError: - self.request['content_length'] = None - self.request['content_type'] = None - - self.request['http_accept_encoding'] = self._environ[ - 'HTTP_ACCEPT_ENCODING'] - - self.request['data'] = {} - line = self._environ['QUERY_STRING'] - request_data = environ['wsgi.input'].read() - if request_data: - for data_pair in request_data.split('&'): - key, value = data_pair.split('=') - self.request['data'][key] = value - query_string = self._environ['QUERY_STRING'] - if query_string: - for data_pair in query_string.split('&'): - try: - key, value = data_pair.split('=') - self.request['data'][key] = value - except ValueError: - pass - - for url in self.urls: - res = self.url_parse(url[0]) - if isinstance(res, tuple): - self._parsed_urls.append((res[0] + '$', url[1], res[1])) - else: - self._parsed_urls.append((res + '$', url[1])) - - def parse(self): - for url_handler in self._parsed_urls: + def parse(self, urls): + for url_handler in urls: if url_handler[0] == r'/': if self._path != '/': continue else: html_code = url_handler[1](self.request) - ''' - if self.setting['statics'] in self._path: - path = self._path.replace( - self.setting['statics'], '') - - try: - res = render_media(path) - except IOError: - raise HTTP404Error("NOT FOUND THIS FILE") - return res - ''' url_reg = re.compile(url_handler[0]) if url_reg.match(self._path): @@ -117,16 +152,24 @@ def parse(self): re_query = re.findall(url_reg, self._path) if re_query[0]: - self.request[url_handler[2]] = re_query[0] - html_code = url_handler[1](self.request) - return html_code + if url_handler[2] in self.request: + raise RouteError("query already in request") + else: - html_code = url_handler[1](self.request) + self.request[url_handler[2]] = re_query[0] + html_code = url_handler[1](self.request) + return html_code + + try: + html_code = url_handler[1](self.request) + except TypeError: + html_code = url_handler[1]() return html_code raise HTTP404Error('REQUEST NOT FOUND IN ROUTE CONFIGURATION') def url_parse(self, path): + path = path.replace(' ', '') if path[-1] != '/': path = path + '/' @@ -138,15 +181,14 @@ def url_parse(self, path): reg = re.compile(r'<(\w+)>') url_query = re.findall(reg, path)[0] - if url_query in self.request: - raise RouteError("query already in request") - else: - self.request[url_query] = None the_url = path.replace('<' + url_query + '>', - '(?P<' + url_query + '>\\w*)') + '(?P<' + url_query + '>\\w+)') return (the_url, url_query) return path + def get_parsed_urls(self): + return self._parsed_urls + class jolla_server(WSGIServer): @@ -154,15 +196,24 @@ def __init__(self, app, port=8000, host="127.0.0.1", debug=False): self.port = port self.host = host self.app = app + + my_app = self.app(get_urls=False) + self.urls = my_app.get_parsed_urls() + WSGIServer.__init__(self, listener=( self.host, self.port), application=self.application) - def application(self, environ, start_response): + def __str__(self): + return "" - the_app = self.app(environ) + def __repr__(self): + return 'Jolla.jolla_serverObeject' + + def application(self, environ, start_response): try: - html_code = the_app.parse() + the_app = self.app(environ) + html_code = the_app.parse(self.urls) if not isinstance(html_code, tuple): html_code = (html_code, ('Content-Type', 'text/html')) status = '200 OK' @@ -171,15 +222,23 @@ def application(self, environ, start_response): html_code = ('404 NOT FOUND', ('Content-Type', 'text/html')) header = [ - html_code[1], ('Server', 'Jolla/1.0') ] + for i in range(1, len(html_code)): + header.append(html_code[i]) + start_response(status, header) return html_code[0] - def run_server(self): + def run_server(self, reload = False): print "the server is running on the {} in the port {}".format(self.host, self.port) - - self.serve_forever() + if reload: + from werkzeug.serving import run_simple + run_simple(self.host, self.port, self, use_debugger=True, use_reloader=True) + else: + self.serve_forever() + + def __call__(self, environ, start_response): + return self.application(environ, start_response) diff --git a/jolla/server.pyc b/jolla/server.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2490a11127c9c8845f19b8a5a073e9212afdc5ab GIT binary patch literal 8606 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 z" + + def empty(self): + if self._data: + return True + else: + return False + + def session_count(self): + return len(self._data) + def add_value(self, key, value): self._data[key] = value return True @@ -25,6 +40,7 @@ def check_value(self, key, value=None): if value: if self._data[key] == value: return True + else: return False else: diff --git a/jolla/session.pyc b/jolla/session.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34cc965dc48eaa5b0af60c629c33a238454e93f8 GIT binary patch literal 2928 zcmcguO>f&q5S^uD%5tK9r8eM05u*hfAwVLaJ+*LyAc=!C2N_tlD5}eXA=im4id4C) zA_jbFdhB25AwhmyfSmgWI&W4I-N0>uLaKyaa%Y#j^WMA}vh_!Ar~A79Lq>~Vi?4UN zxrf~4M3(48QLgA$q8CIzj(8A}jl|koSzDC1$ttmKt*mXzV@moR-pa?^J(-`J*m`xA zV$(ft?nCbQAnZ+ecodON`k2npp+(&8b8|iJ#zf~tMjQ<5hO*jk@ubO9pN3%@57^?Q z&sUPp;k?1KYH9~%T29h&R^{XJX_orIo0q@6{r%P8v?_}9)--kA)&u)Ioz4myj00z# z8&~D+*_q$wZHyV0V{Z)LIrvAa5Be69WjeLS_#L(wGp+J@!9$G&jXUe~N%PJG0>qa% z@>lsj2`(Sib@ktP2lv7|xMUe5eIOmW_t768B;VhEbdVe+$+ySD01FRjtZ7iLi*yie zjPtcIP{BpcHQducud%8*d#wyZ!&kU18J5TghBG$H576&%a|w6vh&rUvh?6A}nR9+f z3XQgqJ`jFP`8MU8L5fCv6N|A+c}H$`kQQCuca;`@7oL4y^cYIMEqXQ!=^j5hwVB^^ zpdzyZi0^{?K3!mAFmB6aTI#wGsVxU*@G7b#oY8Eb3rpFH2?Nv=JoM0Jlm=Yx+Z z$vM%a;tZt#Xhg+Bk>AyGD@EyHS~x39Hk2EXzMane86xi>R8n2lj#k_w6q3kD9Unj_ zdV!3FyF@Aqq+*)qMz;Ty2M$3e)l=Eh{}t_zc!FII+Bs$Bi6$}C zcLA*as=>C;;|ZI-ASjDbBtJa>n51mW<$~65Sfe$@>VyN064el)QL6O^uyG6Bx(L8Y z*)y9>0tKJ*(7lIK)UJxvHPvo)qE3{7gk_U}-eSWgWPH}p@XZ4KFY-;W4E74K{)l%7 zXrXlxuVj{>T|ZDnI=4lD`6UnBHg|xzgCtvmTSfaOPhJA>paHm#%JElp&`glBp!?r| zJ+(dn`RDJz1Iuyz#4sy39)oD4gNM=6xg%}U;O@?GTN_0jXp&OCp?X;3TMY{o-*og9X5zB_P7 K>cU>U7yk+D7I=UF literal 0 HcmV?d00001 diff --git a/setup.py b/setup.py index b2db781..0421e1d 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ setup( name='jolla', keywords=['back-end', 'framework', 'RESTful', 'gevent'], - version='1.0.5', + version='1.1.6', description='high performance RESTful framework', author='aljun', author_email='salamer_gaga@163.com', @@ -15,7 +15,8 @@ download_url='https://github.com/salamer/jolla', install_requires=[ - 'gevent' + 'gevent', + 'werkzeug' ], packages=['jolla'],