Python Decorators: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 19: Строка 19:
 
* http://habrahabr.ru/post/139866/
 
* http://habrahabr.ru/post/139866/
   
  +
Это декоратор:
 
<PRE>
 
<PRE>
 
def webob_wrap(func):
 
def webob_wrap(func):
Строка 30: Строка 31:
   
   
  +
Это собственно функции которые борабатывают URL.
 
<PRE>
 
<PRE>
 
def list_topics_app(environ, start_response):
 
def list_topics_app(environ, start_response):
Строка 44: Строка 46:
 
start_response('200 OK', [('Content-type', 'text/plain')])
 
start_response('200 OK', [('Content-type', 'text/plain')])
 
return "\n".join(["%s=%s" % (k, v) for k, v in environ.items()])
 
return "\n".join(["%s=%s" % (k, v) for k, v in environ.items()])
  +
</PRE>
   
  +
<PRE>
 
 
@webob_wrap
 
@webob_wrap
 
def forum_app(req, environ):
 
def forum_app(req, environ):
Строка 59: Строка 62:
 
else:
 
else:
 
return HTTPNotFound()
 
return HTTPNotFound()
  +
</PRE>
 
  +
<PRE>
 
 
server = simple_server.WSGIServer(
 
server = simple_server.WSGIServer(
 
('127.0.0.1', 8080),
 
('127.0.0.1', 8080),

Версия 10:34, 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


Это собственно функции которые борабатывают URL.

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()