Python Decorators: различия между версиями
Материал из noname.com.ua
Перейти к навигацииПерейти к поискуSirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
| Строка 8: | Строка 8: | ||
from webob import Request |
from webob import Request |
||
from wsgiref import simple_server |
from wsgiref import simple_server |
||
| ⚫ | |||
| + | |||
</PRE> |
</PRE> |
||
webob - работа с HTTP |
webob - работа с HTTP |
||
| Строка 25: | Строка 27: | ||
return app(environ, start_response) |
return app(environ, start_response) |
||
return wrapped |
return wrapped |
||
| + | <PRE> |
||
| − | |||
| ⚫ | |||
| + | <PRE> |
||
def list_topics_app(environ, start_response): |
def list_topics_app(environ, start_response): |
||
start_response('200 OK', [('Content-type', 'text/plain')]) |
start_response('200 OK', [('Content-type', 'text/plain')]) |
||
Версия 10:30, 22 июня 2012
Декораторы в питоне
Разбор только одного примера, что был сложен для меня.
# coding=utf8 from webob import Request from wsgiref import simple_server from webob.exc import HTTPNotFound
webob - работа с HTTP wsgiref - веб сервер. можно использовать любой другой, и имя им легион.
Декоратор. Сама идея декоратора прекрасна - обернуть вызов ф-и в другую ф-ю и потом переопределить оригинальную. вот хорошие ссылки:
def webob_wrap(func):
def wrapped(environ, start_response):
aaa=100
req = Request(environ)
app = func(req, environ)
return app(environ, start_response)
return wrapped
<PRE>
<PRE>
def list_topics_app(environ, start_response):
start_response('200 OK', [('Content-type', 'text/plain')])
return "\n".join(["%s=%s" % (k, v) for k, v in environ.items()])
#return "123"
def view_topic_app(environ, start_response):
start_response('200 OK', [('Content-type', 'text/plain')])
return "\n".join(["%s=%s" % (k, v) for k, v in environ.items()])
#return "123"
def fff(environ, start_response):
start_response('200 OK', [('Content-type', 'text/plain')])
return "\n".join(["%s=%s" % (k, v) for k, v in environ.items()])
@webob_wrap
def forum_app(req, environ):
peek = req.path_info_peek()
if not peek:
return list_topics_app
elif peek == 'new_topic':
return new_topic_app
elif peek.isdigit():
topic_id = int(req.path_info_pop())
environ['forum_app.topic_id'] = topic_id
return view_topic_app
else:
return HTTPNotFound()
server = simple_server.WSGIServer(
('127.0.0.1', 8080),
simple_server.WSGIRequestHandler,
)
server.set_app(forum_app)
server.serve_forever()